Android:为什么本机代码比Java代码快得多

盖伊

在以下SO问题中:https: //stackoverflow.com/questions/2067955/fast-bitmap-blur-for-android-sdk @zeh声称Java模糊算法的端口到C的运行速度提高了40倍。

鉴于大部分代码仅包含计算,并且所有分配仅在实际算法编号处理之前“一次”完成-谁能解释为什么此代码运行速度快40倍?Dalvik JIT是否应该翻译字节码并大大减少与本机编译码速度的差距?

注意:我还没有确定x40的性能会自己提高,但是我在Android平台上遇到的所有严肃的图像处理算法都使用了NDK-因此,这支持了NDK代码运行得更快的观点。

jdr5ca

对于对数据数组进行操作的算法,有两件事会极大地改变Java和C之类的语言之间的性能:

  • 数组边界检查-Java将检查每个访问bmap [i],并确认i在数组边界之内。如果代码试图越界访问,您将得到一个有用的异常。C&C ++不会检查任何内容,只是信任您的代码。对越界访问的最佳响应是页面错误。更可能的结果是“意外行为”。

  • 指针-您可以使用指针显着减少操作。

举一个普通的滤镜(类似于模糊,但是是一维)的无辜示例:

for(i=0; i<ndata-ncoef; ++i) {
  z[i] = 0;
  for(k=0; k<ncoef; ++k) {
    z[i] += c[k] * d[i+k];
  }
}

当您访问数组元素时,coef [k]为:

  • 将数组coef的地址加载到寄存器中
  • 将值k载入寄存器
  • 总结一下
  • 去找那个地址的记忆

可以改善这些数组访问中的每一个,因为您知道索引是顺序的。编译器或JIT都无法知道索引是顺序的,因此无法完全优化(尽管它们一直在尝试)。

在C ++中,您将编写如下代码:

int d[10000];
int z[10000];
int coef[10];
int* zptr;
int* dptr;
int* cptr;
dptr = &(d[0]); // Just being overly explicit here, more likely you would dptr = d;
zptr = &(z[0]); // or zptr = z;
for(i=0; i<(ndata-ncoef); ++i) {
  *zptr = 0; 
  *cptr = coef;
  *dptr = d + i;
  for(k=0; k<ncoef; ++k) {
    *zptr += *cptr * *dptr;
    cptr++;
    dptr++;
  }
  zptr++;
}
       

当您第一次执行此类操作(并成功将其正确设置)时,您会惊讶地发现它的速度有多快。取索引并将索引与基地址相加的所有数组地址计算都将由增量指令代替。

对于诸如图像模糊之类的2D阵列操作,无害代码data [r,c]涉及两个值提取,一个乘法和一个和。因此,对于2D数组,指针的好处是可以删除乘法运算。

因此,该语言可以真正减少CPU必须执行的操作。代价是C ++代码难以阅读和调试。指针错误和缓冲区溢出是黑客的食粮。但是当涉及到原始数字磨削算法时,速度的提高很容易被忽略。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么认为异步代码比同步代码快得多?

来自分类Dev

为什么Python中的这段代码比C ++快得多?

来自分类Dev

为什么<比!=快得多?

来自分类Dev

为什么性能测试向我显示列表比使用我的代码的数组快得多?

来自分类Dev

为什么StringBuilder比String快得多

来自分类常见问题

为什么字典比列表快得多?

来自分类Dev

为什么PreparedStatement比Statement快得多?

来自分类Dev

为什么熊猫.isin比“ in”快得多?

来自分类Dev

为什么EnumerateFiles比计算大小要快得多

来自分类Dev

为什么memcmp比for循环检查要快得多?

来自分类Dev

Python清单:为什么.sort()比sorted()快得多?

来自分类Dev

为什么批处理模式比parfor快得多?

来自分类Dev

为什么ifstream :: read比使用迭代器快得多?

来自分类Dev

为什么strcmp比我的函数快得多?

来自分类Dev

为什么在预热阶段浮点运算要快得多?

来自分类Dev

为什么数组的直接索引比迭代快得多?

来自分类Dev

为什么SSH感觉比HTTP快得多?

来自分类Dev

为什么strcmp比我的函数快得多?

来自分类Dev

为什么memcmp比for循环检查要快得多?

来自分类Dev

为什么在预热阶段浮点运算要快得多?

来自分类Dev

为什么子图比图快得多?

来自分类Dev

为什么wget比通过Chrome下载要快得多?

来自分类Dev

为什么fio seq_writes比dd快得多?

来自分类Dev

为什么数组的直接索引比迭代快得多?

来自分类Dev

为什么在Image上旋转比使用BitmapEncoder快得多?

来自分类Dev

基于代理的模拟:为什么 Netlogo 的运行速度比基于 Java 的 Repast 快得多

来自分类Dev

为什么memcpy到堆栈上的内存比堆上的内存快得多?

来自分类Dev

为什么2 ** 100比math.pow(2,100)快得多?

来自分类Dev

为什么plt.imshow比plt.pcolor快得多?

Related 相关文章

  1. 1

    为什么认为异步代码比同步代码快得多?

  2. 2

    为什么Python中的这段代码比C ++快得多?

  3. 3

    为什么<比!=快得多?

  4. 4

    为什么性能测试向我显示列表比使用我的代码的数组快得多?

  5. 5

    为什么StringBuilder比String快得多

  6. 6

    为什么字典比列表快得多?

  7. 7

    为什么PreparedStatement比Statement快得多?

  8. 8

    为什么熊猫.isin比“ in”快得多?

  9. 9

    为什么EnumerateFiles比计算大小要快得多

  10. 10

    为什么memcmp比for循环检查要快得多?

  11. 11

    Python清单:为什么.sort()比sorted()快得多?

  12. 12

    为什么批处理模式比parfor快得多?

  13. 13

    为什么ifstream :: read比使用迭代器快得多?

  14. 14

    为什么strcmp比我的函数快得多?

  15. 15

    为什么在预热阶段浮点运算要快得多?

  16. 16

    为什么数组的直接索引比迭代快得多?

  17. 17

    为什么SSH感觉比HTTP快得多?

  18. 18

    为什么strcmp比我的函数快得多?

  19. 19

    为什么memcmp比for循环检查要快得多?

  20. 20

    为什么在预热阶段浮点运算要快得多?

  21. 21

    为什么子图比图快得多?

  22. 22

    为什么wget比通过Chrome下载要快得多?

  23. 23

    为什么fio seq_writes比dd快得多?

  24. 24

    为什么数组的直接索引比迭代快得多?

  25. 25

    为什么在Image上旋转比使用BitmapEncoder快得多?

  26. 26

    基于代理的模拟:为什么 Netlogo 的运行速度比基于 Java 的 Repast 快得多

  27. 27

    为什么memcpy到堆栈上的内存比堆上的内存快得多?

  28. 28

    为什么2 ** 100比math.pow(2,100)快得多?

  29. 29

    为什么plt.imshow比plt.pcolor快得多?

热门标签

归档