跳转至

IDL 与其他语言的速度对比

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/the-speed-of-idl-compared-with-other-languages

20199 文章评分:

4.3

IDL 与其他语言的速度对比

匿名作者 2015年1月15日 星期四

由于 IDL 是基于数组的语言,与其他编程语言相比,它能够提供非常好的执行速度。主要原因是基于数组的计算倾向于优化内存访问模式,因为数组元素在内存中相邻存储并按顺序访问。虽然实际计算速度随着时间的推移已经变得快得多,但它通常不是实现计算算法良好速度的瓶颈。相反,内存访问、内存缓存和缓存未命中才是通过降低性能来主导速度的因素。

我想使用一个我之前已经实现的算法进行一个简单、非科学的速度比较。我选择了 LSD 基数排序算法,因为维基百科文章包含了几种编程语言的示例代码:C、C++、C++14、Python、Java。请参阅此链接。也可参考这篇 IDL 博客文章作为参考。

我修改了所有语言的代码,使用一个包含 0 到 9,999,999 之间随机整数的 10,000,000 个元素的 32 位整数数组。主要的修改包括使用基数 256,以及使用一个可以处理 10,000,000 个元素的动态分配数组。对于使用基数 10 的示例(Java),我还需要将桶扩展到 256 以保存每次迭代的直方图。

我在同一个 6 核 Intel(R) Xeon(R) 系统上运行了所有测试。结果如下:

Python:16.3 秒(经过一些优化后,原时间为 29.3 秒) C++:14.0 秒 Java:9.2 秒 C++14:2.2 秒 IDL:0.86 秒 C:0.72 秒

在我的测试中,IDL 最终以微弱差距仅次于 C 实现,位居第二。显然,这些代码示例并没有针对速度进行完全优化,但可能代表了人们在时间不足以优化代码时的编写方式。我还要提一下,IDL 代码的可读性是一个显著优势。IDL 代码仅用 20 行完成,而 C 代码使用了 76 行。这使得对 IDL 代码进行更改和改进变得容易。

这是一个 IDL 表现非常出色的例子。当然也存在其他情况,IDL 代码的运行速度可能远低于最优水平。我发现,在大多数情况下,当我的 IDL 代码运行缓慢时,是由于使用了太多循环和标量操作,而不是更多基于数组的操作。

以下是对 10,000,000 个元素整数排序的 IDL 版本代码清单(在此特定情况下,它也比 IDL 内置排序快 3.8 倍):

pro idlRadix

compile_opt idl2,logical_predicate

n = 10000000

data = randomu(seed, n, /long) mod n

sorted = data

tic

radix = 256LL

factor = 1ull

for i=0,3 do begin

rem = sorted/factor

digit = rem mod radix

factor = factor*radix

h = histogram(digit, min=0, max=radix-1, binsize=1, $

reverse_indices=ri)

sorted = sorted[ri[radix+1:*]]

endfor

toc

tic

tmp = data[sort(data)]

toc

if array_equal(tmp, sorted) then print, 'Sorted correctly'

end

空间数据降维与像素纯度指数 使用 SWIR 和 LWIR 影像分析森林火灾