IDL 与其他语言的速度对比
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