Jeremy,
Yes; Android is nowhere near as fast as iOS when it comes to single-core JavaScript performance, which is really unfortunate. It's not that multi-core performance can't be similar, but that doesn't matter much to a single-threaded JavaScript engine. (And yes, the engines are also different. Android uses Chrome's V8 engine, while iOS offers UIWebView (slow) and WKWebView (much faster than UIWebView via JIT compilation).
Compare the single-core GeekBench 4 numbers for Android (
https://browser.primatelabs.com/android-benchmarks/), and iOS. Notice that the highest performer on the Android side is roughly equivalent to an iPad Air 2. Now, that's not to say an iPad Air 2's performance is bad (it isn't), but there are an awful lot of reasonably current Android devices sitting at iPhone 5s and less speeds. I've got a Samsung Tab S 8.4" tablet that comes in just short of an iPad 4's performance, and its single-threaded JS performance is horrible.
Granted, these are benchmarks -- they don't always reflect real-world use, but they've been reasonably reliable indicators in my experience. My iDevices (even older ones) have always run circles around my Droids. (This has generally been the case natively as well, but it's really obvious with JS.)
Things have improved (as you can see from the higher numbers as of late), but they are still far from ideal.
So, yes: Android devices are way slower than Apple devices. And this is especially true when you get down into the cheaper range. A Kindle Fire HDX (3rd gen) comes in around 960, but those aren't cheap. A Kindle Fire HD lands in the 480s, or a bit faster than an iPad 2 (333), but not nearly as fast as an iPhone 5c (716).
So, what can you do?
- Live with the speed difference -- the single-core performance gap is real
- Utilize workers -- workers run on their own thread.
- Reduce list sizes -- for example, an iPad may have no problem rendering a really long list, but you might need to halve the list size for an Android. (This is assuming you aren't using an infinite scrolling list)
- Reduce animations -- On Android I will often remove view animations. It's faster, and hides the jerkiness of the animation. I have full animations running beautifully on iOS, however.
- Reduce complex styles -- same reason
- Affordances, affordances, affordances -- let the user know that you heard them and utilize tricks to improve apparent responsiveness (note that apparent != actual performance!)
- Optimize. Anything you can do to help speed things up helps tremendously on an Android device. Memoization can help dramatically as well (but with a memory cost).
- And if you're using Babel to transpile, switch to loose mode. It's not a huge boost, but it helps.
- Profile, profile, profile. Find out where the speed bumps are, and target those for improvement.