我听说从非缓存内存中读取一个字节需要50个CPU周期。
那么,从内存中读取int所花费的时间是否是读取char的4倍,这意味着最多需要200个周期?
如果不是,使用*(size_t *)str一次获得4-8个字符,可以节省150-350个CPU周期,是个好主意吗?我想在这种情况下,痴呆症可能会成为一个问题。
此外,函数中使用的局部变量如何?它们是否都被写入注册表,或者在可能的情况下被内联,或者至少在L1中缓存?
发布于 2021-06-06 14:10:06
我听说从非缓存内存中读取一个字节可能需要50个CPU周期。
这将是一个特定CPU的特点,但在一般意义上,是的,从非缓存内存读取是昂贵的。
,那么,从内存中读取
int所花费的时间是阅读char的4倍吗?这意味着最多需要200个周期?
您似乎假设int有4个字节宽,这不一定是这样的。但是不,从内存中连续读取四个字节通常不需要读取一个字节的四倍的周期。内存通常以大于一个字节的块读取--至少机器字大小,在一台具有4字节ints的机器上可能是4,而且通常还会导致将请求位置周围的整个缓存行值的内存加载到缓存中,这样以后访问附近位置的速度就会更快。
如果不是
,那么用
*(size_t *)str一次获得4-8个字符,节省150-350个CPU周期是个好主意吗?我想在这种情况下,痴呆症可能会成为一个问题。
不,这不是个好主意。现代编译器非常擅长生成快速机器代码,而现代CPU和内存控制器的设计考虑了典型的程序行为。您所描述的这种微优化不太可能提高性能,甚至可能通过抑制编译器对编写得更直截了当的代码所执行的优化来损害性能。
此外,如果str将( in )指向一个char数组,而不是真正的size_t,您的特定提议表达式在C中具有未定义的行为,我认为这是您的意图。不过,它可能会产生您期望的结果,但也可能会做许多您不喜欢的事情,例如使程序崩溃。
此外,函数中使用的局部变量如何?它们是否都被写入注册表,或者在可能的情况下被内联,或者至少在L1中缓存?
同样,您的编译器非常擅长生成机器代码。然而,它对局部变量所做的确切操作是编译器特有的,并且可能因函数的不同而略有变化。它在任何情况下都超出了你的控制范围。一个人用C写,而不是程序集,因为他想让编译器来考虑这些问题。
一般而言:
使用好的algorithms.
https://stackoverflow.com/questions/67859785
复制相似问题