Context:
不久前,我偶然发现了 Alexandrescu 在 2001 年发表的 DDJ 文章:http://www.ddj.com/cpp/184403799 http://www.ddj.com/cpp/184403799
它是关于比较将缓冲区初始化为某个值的各种方法。就像“memset”对单字节值所做的那样。他比较了各种实现(memcpy、显式“for”循环、duff 的设备),但并没有真正找到跨所有数据集大小和所有编译器的最佳候选。
Quote:
这一切背后有一种非常深刻、悲伤的认识。现在是 2001 年,空间漫游之年。 (...) 跳出框框看看我们——50 年后,我们仍然不太擅长填充和复制记忆。
问题:
- 有人有关于这个问题的更多最新信息吗?最近的 GCC 和 Visual C++ 实现的性能是否明显优于 7 年前?
- I'm writing code that has a lifetime of 5+ (probably 10+) years and that will process arrays' sizes from a few bytes to hundred of megabytes. I can't assume that my choices now will still be optimal in 5 years. What should I do:
- a)使用系统的memset(或等效的)并忘记最佳性能,或者假设运行时和编译器会为我处理这个问题。
- b) 对各种数组大小和编译器进行一次性基准测试,并在运行时在多个例程之间进行切换。
- c) 在程序初始化时运行基准测试,并根据准确的(?)数据在运行时进行切换。
编辑:我正在研究图像处理软件。我的数组项是 POD,每一毫秒都很重要!
编辑2:感谢您的第一个回答,这里有一些附加信息:
- 缓冲区初始化可能占某些算法总运行时间的 20%-40%。
- 该平台可能会在未来 5 年以上发生变化,但仍将属于“可以从戴尔购买的最快 CPU”类别。编译器将是某种形式的 GCC 和 Visual C++。雷达上没有嵌入式东西或奇异的架构
- 我想听听那些在 MMX 和 SSE 出现时必须更新软件的人的意见,因为当“SSE2015”可用时我也必须做同样的事情......:)
DDJ 文章承认 memset 是最好的答案,并且比他试图实现的目标要快得多:
有一些神圣的东西
C的内存操作函数
memset、memcpy 和 memcmp。他们是
可能会被高度优化
编译器供应商,在某种程度上
编译器可能会检测到对
这些函数并将它们替换为
内联汇编指令——这个
MSVC 就是这种情况。
因此,如果 memset 适合您(即您使用单个字节进行初始化),则使用它。
虽然每一毫秒都很重要,但您应该确定因设置内存而损失了执行时间的百分比。鉴于您也有有用的工作要做,它可能非常低(1 或 2%??)。鉴于优化工作在其他地方可能会获得更好的回报率。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)