语境:
不久前,我偶然发现了 Alexandrescu 在 2001 年发表的这篇 DDJ 文章: http ://www.ddj.com/cpp/184403799
它是关于比较将缓冲区初始化为某个值的各种方法。就像“memset”对单字节值所做的一样。他比较了各种实现(memcpy、显式“for”循环、duff 的设备),并没有真正找到跨越所有数据集大小和所有编译器的最佳候选者。
引用:
这一切背后都有一个非常深刻和悲伤的认识。我们是在 2001 年,空间奥德赛之年。(...) 跳出框框看看我们——50 年后,我们仍然不擅长填充和复制记忆。
问题:
- 有没有人有关于这个问题的最新信息?最近的 GCC 和 Visual C++ 实现的性能是否明显优于 7 年前?
- 我正在编写生命周期为 5 年以上(可能 10 年以上)的代码,它将处理从几个字节到数百兆字节的数组大小。我不能假设我现在的选择在 5 年后仍然是最优的。我应该怎么办:
- a) 使用系统的 memset(或等效项)并忘记最佳性能,或者假设运行时和编译器会为我处理这个问题。
- b) 对各种数组大小和编译器一劳永逸地进行基准测试,并在运行时在多个例程之间切换。
- c) 在程序初始化时运行基准测试,并在运行时根据准确的 (?) 数据进行切换。
编辑:我正在研究图像处理软件。我的数组项是 POD,每毫秒都很重要!
编辑2:感谢第一个答案,这里有一些附加信息:
- 缓冲区初始化可能占某些算法总运行时间的 20%-40%。
- 该平台在未来 5 年以上可能会发生变化,尽管它将保持在“可以从 DELL 购买的最快 CPU”类别中。编译器将是某种形式的 GCC 和 Visual C++。雷达上没有嵌入的东西或异国情调的架构
- 我想听听那些在 MMX 和 SSE 出现时必须更新软件的人的意见,因为当“SSE2015”可用时我也必须这样做...... :)