FFI calls into Haskell taking a long time
Hi, I’m exporting a Haskell function that generates RSA keys for an iOS application. I’m using the crypto-pubkey and crypto-random packages. Unfortunately, the key generation is taking an extremely long time (around 5 minutes) when run in the simulator (XCode 7.2.1). When running Haskell code through Criterion, key generation only takes 110ms. When benchmarking a c program that links the Haskell FFI library (on my x86 laptop), key generation takes about 130ms. Does anyone have any ideas why this is so much slower on the simulator? I thought maybe there was an issue with running out of randomness, so I tried creating a fixed seed by using `createTestEntropyPool`, but this did not make any difference. I’ve included the relevant key generate function below. gen :: MonadRandom m => m (RSA.PublicKey, RSA.PrivateKey) gen = withCPRG $ \prg -> return $ RSA.generate prg 256 65537 instance MonadRandom IO where type MonadCPRG IO = SystemRNG withCPRG f = do entropy <- createEntropyPool (res, _) <- f $ cprgCreate entropy return res I’d appreciate any help. Thanks! James
Did you try on the device? The simulator is a strange beast and its performance may not be representative of what you get on a real device. Manuel
James Parker
: Hi,
I’m exporting a Haskell function that generates RSA keys for an iOS application. I’m using the crypto-pubkey and crypto-random packages. Unfortunately, the key generation is taking an extremely long time (around 5 minutes) when run in the simulator (XCode 7.2.1). When running Haskell code through Criterion, key generation only takes 110ms. When benchmarking a c program that links the Haskell FFI library (on my x86 laptop), key generation takes about 130ms.
Does anyone have any ideas why this is so much slower on the simulator? I thought maybe there was an issue with running out of randomness, so I tried creating a fixed seed by using `createTestEntropyPool`, but this did not make any difference. I’ve included the relevant key generate function below.
gen :: MonadRandom m => m (RSA.PublicKey, RSA.PrivateKey) gen = withCPRG $ \prg -> return $ RSA.generate prg 256 65537
instance MonadRandom IO where type MonadCPRG IO = SystemRNG
withCPRG f = do entropy <- createEntropyPool (res, _) <- f $ cprgCreate entropy return res
I’d appreciate any help.
Thanks!
James _______________________________________________ iPhone mailing list iPhone@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/iphone
Hi, Sorry, it took a while to get running on the device. Yes, I still get the slowdown on the device. XCode is reporting 99-100% CPU usage while memory stays pretty consistent (around 18MB). This is similar to what I was seeing on the simulator. Are there any tools to benchmark where time is being spent on the device? Is there some way to enable -enable-library-profiling? Thanks, James
On Apr 6, 2016, at 7:45 PM, Manuel M T Chakravarty
wrote: Did you try on the device? The simulator is a strange beast and its performance may not be representative of what you get on a real device.
Manuel
James Parker
: Hi,
I’m exporting a Haskell function that generates RSA keys for an iOS application. I’m using the crypto-pubkey and crypto-random packages. Unfortunately, the key generation is taking an extremely long time (around 5 minutes) when run in the simulator (XCode 7.2.1). When running Haskell code through Criterion, key generation only takes 110ms. When benchmarking a c program that links the Haskell FFI library (on my x86 laptop), key generation takes about 130ms.
Does anyone have any ideas why this is so much slower on the simulator? I thought maybe there was an issue with running out of randomness, so I tried creating a fixed seed by using `createTestEntropyPool`, but this did not make any difference. I’ve included the relevant key generate function below.
gen :: MonadRandom m => m (RSA.PublicKey, RSA.PrivateKey) gen = withCPRG $ \prg -> return $ RSA.generate prg 256 65537
instance MonadRandom IO where type MonadCPRG IO = SystemRNG
withCPRG f = do entropy <- createEntropyPool (res, _) <- f $ cprgCreate entropy return res
I’d appreciate any help.
Thanks!
James _______________________________________________ iPhone mailing list iPhone@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/iphone
Hi, I’ve been looking into this some more. It looks like generatePrime http://hackage.haskell.org/package/crypto-numbers-0.2.7/docs/src/Crypto-Numb... is causing the slowdown. I manually added some benchmarking and logging to this function and its dependencies (I removed the gmp code). Here is the output from the iOS version: http://lpaste.net/6160729019554725888 http://lpaste.net/6160729019554725888 Here is the output run natively on my machine: http://lpaste.net/2971101072195584000 http://lpaste.net/2971101072195584000 As you can see, the iOS version is much slower (about 75x). What differences are there when cross-compiling for iOS that might explain this difference? It looks like the iOS version might be using integer-simple instead of gmp? Are there any other differences? Thanks! James
On Apr 8, 2016, at 2:47 PM, James Parker
wrote: Hi,
Sorry, it took a while to get running on the device. Yes, I still get the slowdown on the device. XCode is reporting 99-100% CPU usage while memory stays pretty consistent (around 18MB). This is similar to what I was seeing on the simulator.
Are there any tools to benchmark where time is being spent on the device? Is there some way to enable -enable-library-profiling?
Thanks,
James
On Apr 6, 2016, at 7:45 PM, Manuel M T Chakravarty
wrote: Did you try on the device? The simulator is a strange beast and its performance may not be representative of what you get on a real device.
Manuel
James Parker
: Hi,
I’m exporting a Haskell function that generates RSA keys for an iOS application. I’m using the crypto-pubkey and crypto-random packages. Unfortunately, the key generation is taking an extremely long time (around 5 minutes) when run in the simulator (XCode 7.2.1). When running Haskell code through Criterion, key generation only takes 110ms. When benchmarking a c program that links the Haskell FFI library (on my x86 laptop), key generation takes about 130ms.
Does anyone have any ideas why this is so much slower on the simulator? I thought maybe there was an issue with running out of randomness, so I tried creating a fixed seed by using `createTestEntropyPool`, but this did not make any difference. I’ve included the relevant key generate function below.
gen :: MonadRandom m => m (RSA.PublicKey, RSA.PrivateKey) gen = withCPRG $ \prg -> return $ RSA.generate prg 256 65537
instance MonadRandom IO where type MonadCPRG IO = SystemRNG
withCPRG f = do entropy <- createEntropyPool (res, _) <- f $ cprgCreate entropy return res
I’d appreciate any help.
Thanks!
James _______________________________________________ iPhone mailing list iPhone@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/iphone
participants (2)
-
James Parker -
Manuel M T Chakravarty