 <p>As @zapl mentioned, only 4 to 5 times slower is about what you should expect in the first place. However, there are things to optimize:</p> <ol> <li><p>You could benchmark the 'pain' loop codeblock, and rewrite than in NEON. NEON <strong>intrinsics</strong> should be about 2-4 times faster than unoptimized c/c++ code. NEON <strong>assembly</strong> is often faster than <strong>intrinsics</strong>, but harder to write.</p></li> <li><p>Use the latest GCC 4.7 and enable GCC's 'loop unroll' and 'loop vectorization' (not 100% sure GCC does implement loop vectorization for the ARM platform).</p></li> <li><p>Use multi-threading (C++11). Almost all mobile processors have multiple cores. Running on four cores is about 2-3.5 times faster than running on a single core.</p></li> <li><p>Help the CPU's branch predictor make better judgement on what to process next, by moving if-statements outside of loops. </p></li> </ol> <p>For example:</p> <pre><code>for(int i = 0; i &lt; total; i++) { if (i &lt; middle) // first part else // second part } </code></pre> <p>Replace by:</p> <pre><code>for(int i = 0; i &lt; middle; i++) // first part for(int i = middle; i &lt; total; i++) // second part </code></pre>