c++ - 使用现代编译器的 C++ 中的 "memset"功能状态

标签 c++ c optimization memory

上下文:

不久前,我偶然发现了 Alexandrescu 在 2001 年发表的这篇 DDJ 文章: http://www.ddj.com/cpp/184403799

这是关于将缓冲区初始化为某个值的各种方法的比较。就像“memset”对单字节值所做的一样。他比较了各种实现(memcpy、显式“for”循环、duff 的设备),并没有真正找到跨所有数据集大小和所有编译器的最佳候选者。

引用:

There is a very deep, and sad, realization underlying all this. We are in 2001, the year of the Spatial Odyssey. (...) Just step out of the box and look at us — after 50 years, we're still not terribly good at filling and copying memory.

问题:

  1. 有没有人有关于这个问题的最新信息?最近的 GCC 和 Visual C++ 实现的性能是否明显优于 7 年前?
  2. 我正在编写生命周期超过 5 年(可能超过 10 年)的代码,它将处理从几个字节到数百兆字节的数组大小。我不能假设我现在的选择在 5 年后仍然是最优的。我应该怎么办:
    • a) 使用系统的 memset(或等效项)而忘记最佳性能,或者假设运行时和编译器会为我处理这个问题。
    • b) 对各种数组大小和编译器一劳永逸地进行基准测试,并在运行时在多个例程之间切换。
    • c) 在程序初始化时运行基准测试,并在运行时根据准确的 (?) 数据进行切换。

编辑:我正在研究图像处理软件。我的数组项是 POD,每毫秒都很重要!

编辑 2:感谢第一个答案,这里有一些附加信息:

  • 缓冲区初始化可能占某些算法总运行时间的 20%-40%。
  • 该平台在未来 5 年以上可能会发生变化,尽管它将保持在“可以从 DELL 购买的最快 CPU”类别中。编译器将是某种形式的 GCC 和 Visual C++。雷达上没有嵌入的东西或奇异的架构
  • 我想听听那些在 MMX 和 SSE 出现时必须更新软件的人的意见,因为当“SSE2015”成为可用的... :)

最佳答案

DDJ 文章承认 memset 是最好的答案,而且比他试图实现的要快得多:

There is something sacrosanct about C's memory manipulation functions memset, memcpy, and memcmp. They are likely to be highly optimized by the compiler vendor, to the extent that the compiler might detect calls to these functions and replace them with inline assembler instructions — this is the case with MSVC.

所以,如果 memset 适合您(即您正在使用单个字节进行初始化),那么请使用它。

虽然每毫秒都可能很重要,但您应该确定在设置内存方面浪费了多少执行时间。考虑到您还有有用的工作要做,它可能非常低(1% 或 2%??)。鉴于优化工作可能会在其他地方获得更好的返回率。

关于c++ - 使用现代编译器的 C++ 中的 "memset"功能状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/171917/

相关文章:

c++ - 语法错误,无法在 C++ 类中使用结构

c++ - 捕获 const this

c++ - 如何分配 "array of object"的指针 (C++)

c - gcc 不再允许空数组吗?

javascript - 如何使用 JavaScript 选择和删除 Illustrator 文档中的每个剪贴蒙版?

C++:类成员(变量)的前向声明

复制C多维数组

字符指针和 IF 语句

c# - 创建一个不复制的 ImmutableArray

gcc - 如何知道 clang 和 gcc 为每个 mcpu 和 March 选项启用了哪些优化?