C++ 如何在C/C++;
这个问题没有考虑CPU缓存。也就是说,让缓存完成它的工作(让cpu缓存提高性能) 我的想法是分配足够大的内存块(以便不是所有的内存都能放入缓存),并将它们视为一种数据类型(如C++ 如何在C/C++;,c++,c,C++,C,这个问题没有考虑CPU缓存。也就是说,让缓存完成它的工作(让cpu缓存提高性能) 我的想法是分配足够大的内存块(以便不是所有的内存都能放入缓存),并将它们视为一种数据类型(如int),并进行添加,以避免编译器完全优化代码以读取内存。问题是数据类型是否影响测量?还是有更普遍的方法 编辑:以前可能有点误导。AIDA64的内存和缓存基准就是一个例子,它能够测量内存读/写速度以及延迟。我想知道它是如何实现的。像这样的微基准在C/C++中并不容易。C++中的某些时间不是语言的特定方面。事实上,对于除此之外
int
),并进行添加,以避免编译器完全优化代码以读取内存。问题是数据类型是否影响测量?还是有更普遍的方法
编辑:以前可能有点误导。AIDA64的内存和缓存基准就是一个例子,它能够测量内存读/写速度以及延迟。我想知道它是如何实现的。像这样的微基准在C/C++中并不容易。C++中的某些时间不是语言的特定方面。事实上,对于除此之外的所有用例,速度越快越好,因此鼓励编译器做明智的事情 解决这些问题的诀窍是编写基准测试,编译它,然后查看程序集,看看它是否做得很巧妙。或者,至少,检查以确保它有意义(访问更多内存=更多时间) 编译器正在变得智能化。添加并不总是足够的。我不止一次让VisualStudio意识到我在构造微基准并编译它
目前,我很幸运地将
argc
参数作为种子传递到main中,并使用加密散列(如SHA1或MD-5)填充数据。这往往足以诱使编译器实际编写所有读取。但是请验证您的结果。不能保证新的编译器不会变得更智能。像这样的微基准在C/C++中并不容易。C++中的某些时间不是语言的特定方面。事实上,对于除此之外的所有用例,速度越快越好,因此鼓励编译器做明智的事情
解决这些问题的诀窍是编写基准测试,编译它,然后查看程序集,看看它是否做得很巧妙。或者,至少,检查以确保它有意义(访问更多内存=更多时间)
编译器正在变得智能化。添加并不总是足够的。我不止一次让VisualStudio意识到我在构造微基准并编译它
目前,我很幸运地将
argc
参数作为种子传递到main中,并使用加密散列(如SHA1或MD-5)填充数据。这往往足以诱使编译器实际编写所有读取。但是请验证您的结果。不能保证新的编译器不会变得更智能。编译器不会愚蠢到将类型视为不可分割的内存块。你需要一种不同的方法。忽略缓存也没有多大意义。缓存总是存在的。很容易指示编译器不要优化内存访问:使用volatile
类型。是的,数据类型会影响测量和/或性能。由于处理器的特性,而不是内存性能,加载字节而不是字可能需要更多的时间。没有通用的方法来做这件事。尽管强制编译器实际读取内存很容易,但确保测量内存性能却不容易。例如,您必须确保页面已映射,以免度量页面加载而不是内存读取的性能。这些问题依赖于系统,而且(太)广泛。编译器不会愚蠢到将类型视为不可分割的内存块。你需要一种不同的方法。忽略缓存也没有多大意义。缓存总是存在的。很容易指示编译器不要优化内存访问:使用volatile
类型。是的,数据类型会影响测量和/或性能。由于处理器的特性,而不是内存性能,加载字节而不是字可能需要更多的时间。没有通用的方法来做这件事。尽管强制编译器实际读取内存很容易,但确保测量内存性能却不容易。例如,您必须确保页面已映射,以免度量页面加载而不是内存读取的性能。这些问题取决于系统,而且(太)广泛。