使用比内置阵列更加用户友好的valarray会有很大的损失吗?你知道一些基准吗?
答案 0 :(得分:7)
valarray
意图以提高获得良好优化的机会。无论好坏,它都成为标准库中被遗忘的继子之物;我不知道有什么实现可以利用它提供的功能。更糟糕的是,该设计实际上是为矢量处理器设计的,并且对于使用缓存的处理器效果不佳 - 几乎所有内容都不再适用。
我不知道任何真正严肃的基准测试,但在我的(不可否认,非常非正式)测试中,只要你处理的是小内存数组(或std :: vector)大量的数据,但如果你有足够的数据使其不适合缓存,合理谨慎地使用内置数组或std::vector
通常会更快。
就“合理小心”而言,它归结为:为了使缓存友好,你通常想要读取一段特定的数据,对它进行所有处理,然后编写它退出。 valarray
几乎完全相反:它对整个数组应用单个操作,然后将下一个操作应用于整个数组,依此类推,直到你完成。
在Cray(例如)运行良好的情况下 - 它有三组64个寄存器(理想情况下)可以旋转,因此在任何给定的时钟周期内,您从内存中读取一组64个寄存器,应用了单次操作到第二组,然后写出第三组。下一个周期你要“旋转”它们,所以你对刚刚读过的64个操作进行了操作,写出了你刚创建的结果,并将数据读入你刚刚写好的寄存器中。当事情发生时,与标量处理相比,你获得了64倍的加速。大多数当前的处理器都有一些矢量处理,但每个时钟周期只有大约2到4个操作数 - 同时,它们通常主要受到主存储器带宽的限制,这正是该模式最需要的。 / p>
答案 1 :(得分:1)
对于大型(大于缓存)数组,Jerry是对的。 valarray
除了包装new[]
之外,还提供基本操作,但它们不会产生最有效的代码。
我从来不需要使用这样的系统,但是如果你确实需要大型矩阵的高效且可维护的代数,expression templates就是答案。
Google搜索出现http://met.sourceforge.net/,其中包含指向其他资源的链接。
答案 2 :(得分:0)
我不相信内置数组有任何开销。当然,这是实现的定义。我怀疑,如果任何语言功能是你的应用程序的瓶颈,你有很多我们想要的问题:)
但是,我很好奇你为什么要这样做而不是使用vector
?