使用随机数组索引时的代码速度差异



给定一个在[0,1]范围内的实数X,在一个特定的bin之后,我必须确定X落在哪个bin中。给定箱子大小dx,我使用i = std::size_t(X/dx),它工作得很好。然后我查找给定数组v的相应值,并使用double Y=v[i]设置第二个变量Y。整个代码如下所示:

double X = func();
dx=0.01;
int i = std::size_t(X/dx);
double Y = v[i];
print(Y)

该方法正确地给出了索引i在[0,length(v)]范围内的期望值。

我的主要问题不是找到索引,而是使用它:X是从辅助函数确定的,每当我需要使用上面确定的索引设置Y=v[i]时,代码就变得非常慢。在不注释或删除任何行的情况下,在定义之后将X设置为0到1之间的随机值,或者在第三行之后将i设置为0到v长度之间的随机值,代码会变得快得多。

有人能告诉我为什么会这样吗?速度变化了1000倍,如果不是更多的话,因为在更快的方法中只有额外的步骤,而且func()无论如何都被调用,我不明白为什么它应该变得更快。

由于您没有在问题中放入代码,因此必须像这样进行胡乱猜测:

  • 在访问查找表之前没有对所有X结果进行排序。

  • X的一些值是非规格化的,这对某些CPU类型(包括您的CPU)的计算时间造成了影响。

  • 数据集对于L3缓存来说太大了,它总是访问RAM,而不是在其他测试中看到的快速缓存命中。

  • 编译器正在优化所有昂贵的函数调用,但在实际测试场景中,它不是。

  • 时间测量有bug

  • 计算机性能不稳定(如作为共享服务器或防病毒干预消耗RAM带宽)

相关内容

  • 没有找到相关文章