[Haskell-cafe] scotty + aeson + ffi: optimising performance

Miro Karpis miroslav.karpis at gmail.com
Fri Apr 4 22:17:04 UTC 2014


Hi,
I have a C++ program that is doing some IO with one shared library (dll). I
made a Haskell program that uses ffi for communicating with external dll.
With scotty and aeson I made a web-service that communicates with the dll
via REST-API (json). I was expecting that the performance would be a bit
slower than the c++ internal dll calls, but I'm getting approx 3x slower
performance in my haskell program.

I tried to profile it but so far I can see that the bottleneck is Aeson
(please correct me if I'm wrong). Is there a way how to optimise it? The
data I'm sending via JSON are very small, so that can not be the problem.


I have compiled the program with:

ghc -O2 --make Service.hs -o eDS_FM -prof -auto-all -L. -lextlib

Cheers,
Miro



profile:

Fri Apr 04 23:57 2014 Time and Allocation Profiling Report  (Final)

   eDS_FM.exe +RTS -p -RTS

total time  =        0.81 secs   (810 ticks @ 1000 us, 1 processor)
total alloc = 638,446,652 bytes  (excludes profiling overheads)

COST CENTRE                 MODULE                     %time %alloc

MAIN                        MAIN                        65.3   63.1
go/Number                   Data.Aeson.Encode           22.5   26.2
array_                      Data.Aeson.Parser.Internal   7.0    6.6
tableArrayInDataToJSON.json FM.Json                      1.5    0.9
go/Array                    Data.Aeson.Encode            1.4    1.1



                            individual     inherited
COST CENTRE                                 MODULE
           no.     entries  %time %alloc   %time %alloc

MAIN                                        MAIN
           172           0   65.3   63.1   100.0  100.0
 unstream/resize                            Data.Text.Fusion
           419           7    0.0    0.0     0.0    0.0
 main.arrayDouble                           Main
           415        2158    0.0    0.2     0.0    0.2
 main.retCodeInt                            Main
           414        2158    0.0    0.0     0.0    0.0
 main.dataOut                               Main
           413        2158    0.0    0.0     0.0    0.0
 getarray.paramLength                       FM.ModelIO
           408        2158    0.0    0.0     0.0    0.0
 getarray                                   FM.ModelIO
           407        2158    0.1    0.7     0.1    0.7
  getarray.rowsReturnedInt                  FM.ModelIO
           412        2158    0.0    0.0     0.0    0.0
  getarray.arrayPtr                         FM.ModelIO
           411        2158    0.0    0.0     0.0    0.0
 main.resultInt                             Main
           396           1    0.0    0.0     0.0    0.0
 main.resultInt                             Main
           395           1    0.0    0.0     0.0    0.0
 setmodulestring                            FM.ModelIO
           391           1    0.0    0.0     0.0    0.0
  setmodulestring.setVarInArray             FM.ModelIO
           394           1    0.0    0.0     0.0    0.0
  setmodulestring.cValueLength              FM.ModelIO
           393           1    0.0    0.0     0.0    0.0
  setmodulestring.cParamLength              FM.ModelIO
           392           1    0.0    0.0     0.0    0.0
 main.queryString                           Main
           385           1    0.0    0.0     0.0    0.0
  stringDataToJSON                          FM.Json
          386           1    0.0    0.0     0.0    0.0
   stringDataToJSON.json                    FM.Json
          388           1    0.0    0.0     0.0    0.0
    object_                                 Data.Aeson.Parser.Internal
           389           0    0.0    0.0     0.0    0.0
     jstring_                               Data.Aeson.Parser.Internal
           390           4    0.0    0.0     0.0    0.0
   stringDataToJSON.retValue                FM.Json
          387           1    0.0    0.0     0.0    0.0
 main.resultInt                             Main
           382         290    0.0    0.0     0.0    0.0
 go/Object                                  Data.Aeson.Encode
          379        2553    0.0    0.1    24.1   27.5
  go/Array                                  Data.Aeson.Encode
          416        2158    1.2    0.8    21.7   26.2
   go/Number                                Data.Aeson.Encode
          418       63801   20.5   25.4    20.5   25.4
  go/Number                                 Data.Aeson.Encode
          383        2656    0.1    0.1     0.1    0.1
  string                                    Data.Aeson.Encode
          380        4814    0.1    0.1     2.2    1.1
   go/Number                                Data.Aeson.Encode
          384           0    1.9    0.8     2.0    1.0
    go/Array                                Data.Aeson.Encode
          417           0    0.1    0.2     0.1    0.2
   break                                    Data.Aeson.Encode
          381        4814    0.1    0.0     0.1    0.0
 setmoduletable                             FM.ModelIO
           372         290    0.2    0.0     0.4    0.1
  setmoduletable.cRows                      FM.ModelIO
           376         290    0.0    0.0     0.0    0.0
  setmoduletable.cColumns                   FM.ModelIO
           375         290    0.0    0.0     0.0    0.0
  setmoduletable.cParamLength               FM.ModelIO
           374         290    0.1    0.0     0.1    0.0
  setmoduletable.cTable                     FM.ModelIO
           373         290    0.0    0.0     0.0    0.0
 main.queryString                           Main
           363         290    0.0    0.0     9.6    7.7
  tableArrayInDataToJSON                    FM.Json
          364         290    0.0    0.0     9.6    7.7
   tableArrayInDataToJSON.json              FM.Json
          366         290    1.5    0.9     9.6    7.7
    object_                                 Data.Aeson.Parser.Internal
           368           0    0.1    0.0     8.1    6.8
     jstring_                               Data.Aeson.Parser.Internal
           369        1450    1.0    0.2     8.0    6.8
      array_                                Data.Aeson.Parser.Internal
           371           0    7.0    6.6     7.0    6.6
   tableArrayInDataToJSON.retValue          FM.Json
          365         290    0.0    0.0     0.0    0.0
 main                                       Main
           345           0    0.2    0.7     0.2    0.7
  run                                       FM.ModelIO
           398           0    0.0    0.0     0.0    0.0
   run.result                               FM.ModelIO
           405         103    0.0    0.0     0.0    0.0
   run.timeTotal                            FM.ModelIO
           404         103    0.0    0.0     0.0    0.0
   run.retData                              FM.ModelIO
           403         103    0.0    0.0     0.0    0.0
 CAF
 GHC.Integer.Logarithms.Internals          343           0    0.0    0.0
  0.0    0.0
 CAF                                        GHC.Float.ConversionUtils
          340           0    0.0    0.0     0.0    0.0
 CAF                                        GHC.IO.Encoding.CodePage
           327           0    0.0    0.0     0.0    0.0
 CAF                                        GHC.Conc.Windows
           317           0    0.0    0.0     0.0    0.0
 CAF                                        GHC.TopHandler
           315           0    0.0    0.0     0.0    0.0
 CAF                                        GHC.Float
          312           0    0.0    0.0     0.0    0.0
 CAF                                        Data.Fixed
           301           0    0.0    0.0     0.0    0.0
 CAF                                        GHC.IO.Handle.FD
           299           0    0.0    0.0     0.0    0.0
 CAF                                        GHC.IO.Encoding
          295           0    0.0    0.0     0.0    0.0
 CAF                                        GHC.IO.Exception
           294           0    0.1    0.0     0.1    0.0
 CAF
 Data.Text.Lazy.Builder.Int.Digits         282           0    0.0    0.0
  0.0    0.0
 CAF                                        Data.Text.Lazy.Builder.Int
           281           0    0.0    0.0     0.0    0.0
 CAF                                        Data.Text.Array
          275           0    0.0    0.0     0.0    0.0
 CAF                                        Data.Text.Internal
           274           0    0.0    0.0     0.0    0.0
 CAF                                        System.Locale
          269           0    0.0    0.0     0.0    0.0
 CAF                                        Data.Scientific
          268           0    0.0    0.0     0.0    0.0
 CAF                                        Data.Time.LocalTime.TimeOfDay
          265           0    0.0    0.0     0.0    0.0
 CAF                                        Data.Time.Clock.POSIX
          263           0    0.0    0.0     0.0    0.0
 CAF                                        Data.Aeson.Parser.Internal
           256           0    0.0    0.0     0.0    0.0
  array_                                    Data.Aeson.Parser.Internal
           370           1    0.0    0.0     0.0    0.0
  object_                                   Data.Aeson.Parser.Internal
           367           1    0.0    0.0     0.0    0.0
 CAF                                        Blaze.ByteString.Builder.HTTP
          249           0    0.0    0.0     0.0    0.0
 CAF                                        Network.HTTP.Types.Header
          227           0    0.0    0.0     0.0    0.0
 CAF                                        Network.HTTP.Types.URI
           226           0    0.0    0.0     0.0    0.0
 CAF                                        Network.HTTP.Types.Status
          225           0    0.0    0.0     0.0    0.0
 CAF                                        Network.HTTP.Types.Method
          224           0    0.0    0.0     0.0    0.0
 CAF                                        Network.Socket
           220           0    0.0    0.0     0.0    0.0
 CAF                                        Network.Wai.Parse
          211           0    0.0    0.0     0.0    0.0
 CAF
 Network.Wai.Handler.Warp.RequestHeader    203           0    0.0    0.0
  0.0    0.0
 CAF
 Network.Wai.Handler.Warp.ResponseHeader   202           0    0.0    0.0
  0.0    0.0
 CAF                                        Network.Wai.Handler.Warp.Date
          199           0    0.0    0.0     0.0    0.0
 CAF
 Network.Wai.Handler.Warp.Request          197           0    0.0    0.0
  0.0    0.0
 CAF
 Network.Wai.Handler.Warp.Response         196           0    0.0    0.0
  0.0    0.0
 CAF                                        Network.Wai.Handler.Warp.Recv
          194           0    0.0    0.0     0.0    0.0
 CAF                                        Network.Wai.Handler.Warp.Header
          193           0    0.0    0.0     0.0    0.0
 CAF                                        Network.Wai.Handler.Warp.Types
           191           0    0.0    0.0     0.0    0.0
 CAF
 Network.Wai.Handler.Warp.Settings         189           0    0.0    0.0
  0.0    0.0
 CAF                                        Web.Scotty.Trans
           187           0    0.0    0.0     0.0    0.0
 CAF                                        Web.Scotty.Route
           186           0    0.0    0.0     0.0    0.0
 CAF                                        Web.Scotty.Types
           185           0    0.0    0.0     0.0    0.0
  unstreamChunks/inner                      Data.Text.Lazy.Fusion
          349           0    0.0    0.0     0.0    0.0
   unstreamChunks/outer                     Data.Text.Lazy.Fusion
          350           1    0.0    0.0     0.0    0.0
 CAF                                        Web.Scotty.Action
          184           0    0.0    0.0     0.0    0.0
  unstreamChunks/outer                      Data.Text.Lazy.Fusion
          353           4    0.0    0.0     0.0    0.0
   unstreamChunks/inner                     Data.Text.Lazy.Fusion
          354          28    0.0    0.0     0.0    0.0
    unstreamChunks/resize                   Data.Text.Lazy.Fusion
          355           5    0.0    0.0     0.0    0.0
 CAF                                        Main
           182           0    0.0    0.0     0.0    0.0
  unstreamChunks/outer                      Data.Text.Lazy.Fusion
          406           1    0.0    0.0     0.0    0.0
  main.resultInt                            Main
           360           1    0.0    0.0     0.0    0.0
  main                                      Main
           344           1    0.0    0.0     0.0    0.0
   go/Object                                Data.Aeson.Encode
          357           1    0.0    0.0     0.0    0.0
    go/Number                               Data.Aeson.Encode
          361           1    0.0    0.0     0.0    0.0
    string                                  Data.Aeson.Encode
          358           1    0.0    0.0     0.0    0.0
     go/Number                              Data.Aeson.Encode
          362           0    0.0    0.0     0.0    0.0
     break                                  Data.Aeson.Encode
          359           1    0.0    0.0     0.0    0.0
   unstreamChunks/outer                     Data.Text.Lazy.Fusion
          346          10    0.0    0.0     0.0    0.0
    unstreamChunks/inner                    Data.Text.Lazy.Fusion
          347         104    0.0    0.0     0.0    0.0
     unstreamChunks/resize                  Data.Text.Lazy.Fusion
          348          20    0.0    0.0     0.0    0.0
 CAF                                        FM.Json
          180           0    0.1    0.0     0.1    0.0
  unstream/resize                           Data.Text.Fusion
           356          14    0.0    0.0     0.0    0.0
 CAF                                        FM.ModelIO
           179           0    0.0    0.0     0.0    0.0
  getarray                                  FM.ModelIO
           409           0    0.0    0.0     0.0    0.0
   getarray.rows                            FM.ModelIO
           410           1    0.0    0.0     0.0    0.0
  run.timeTot                               FM.ModelIO
           399           1    0.0    0.0     0.0    0.0
  run                                       FM.ModelIO
           397           1    0.0    0.0     0.0    0.0
   run.runType                              FM.ModelIO
           402           1    0.0    0.0     0.0    0.0
   run.timeNow                              FM.ModelIO
           401           1    0.0    0.0     0.0    0.0
   run.timeTot                              FM.ModelIO
           400           0    0.0    0.0     0.0    0.0
  setmoduletable                            FM.ModelIO
           377           0    0.0    0.0     0.0    0.0
   setmoduletable.firstTimeStepAfterRestart FM.ModelIO
           378           1    0.0    0.0     0.0    0.0
  initfm                                    FM.ModelIO
           351           1    0.0    0.0     0.0    0.0
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20140405/d9db74ca/attachment.html>


More information about the Haskell-Cafe mailing list