为什么从引用中获取数据的速度比在c#中计算要慢



我测试了2种类型,以在65000000的循环后面获得我的数据。不同的是0.5-0.6秒。

测试1:

 ushort e = myFunction(a, b, c);
 ushort d = (ushort)(e + (f << 13));
private static ushort myFunction(ushort a, int b, int c) {
if (a < (ushort)b)
       return 0;
if (a > (ushort)c)
      return (ushort)(c - b);
return (ushort)(a - b);

测试2:

ushort d = arr2Dimension[i, j].data;

dataarr2Dimension的类类型的公共数据成员。

我(单独)检查了每项测试的时间3次,第一次测试总是快0.5-0.6秒左右。

为什么?(为什么通过引用获取数据的速度较慢?)

如果你不发布我们可以自己运行的代码,很难给你一个准确的答案。但是,是的,有一种这样的代码模式,你基本上发现访问内存是处理器能做的最慢的事情之一

这是一个与距离有关的问题,电子电路被物理移除得越远,信号就必须越慢,以确保它不会被破坏。这是电子工程中"没有免费午餐"的基本原则。以及为什么在硅中使用较小功能尺寸的新处理器会自动更快。

myFunction()方法使用的处理器资源非常接近。a、b和c变量以及方法返回值存储在寄存器中,这是一个非常小的存储位置,非常靠近处理器的执行引擎。尽可能接近。期望这段代码以全孔径运行,在每个时钟周期同时执行几个指令。它可能会因if()语句而陷入困境,只有当处理器有良好的分支预测数据可用时,它们才会很快。取决于在以前执行该方法时分支的一致性。或者换句话说,a、b和c值的随机性。

但是,阵列需要访问而非靠近处理器的电路。数组元素可能存在于一级缓存中,这需要3个周期。如果预取器猜对了,可以是一个循环。当阵列很大时,当处理器只能在L2或L3高速缓存中找到它时,速度开始下降。当它必须从RAM中检索时,这将是可怕的,处理器将停滞150个周期,等待RAM提供数据。随着距离的增加,您可以弹出机箱,查看连接RAM和处理器的电线

最新更新