我有个问题....
我在while循环中将数据写入数组。关键是我真的经常这样做。看来这本书现在已成为代码中的瓶颈。因此,我想这是由于写入内存引起的。这个数组不是真的很大(大概300个元素)。问题是有可能以这种方式做到这一点:将其存储在高速缓存中并仅在while循环完成之后才在内存中进行更新吗?

[编辑-从亚历克斯添加的答案中复制]

double* array1  = new double[1000000]; // this array has elements
unsigned long* array2  = unsigned long[300];
double varX,t,sum=0;
int iter=0,i=0;
while(i<=max_steps)
{
   varX+=difX;
   nm0 =  int(varX);
   if(nm1!=nm0)
   {
        array2[iter] = nm0;  // if you comment this string application works more then 2 times faster :)
        nm1=nm0;
        t = array1[nm0]; // if you comment this string , there is almost no change in time
        ++iter;
   }
   sum+=t;
   ++i;
}

首先,我要感谢大家的回答。确实,不放置代码有点愚蠢。所以我决定现在就做。
double* array1  = new double[1000000]; // this array has elements
unsigned long* array2  = unsigned long[300];
double varX,t,sum=0;
int iter=0,i=0;
while(i<=max_steps)
{
   varX+=difX;
   nm0 =  int(varX);
   if(nm1!=nm0)
   {
        array2[iter] = nm0;  // if you comment this string application works more then 2 times faster :)
        nm1=nm0;
        t = array1[nm0]; // if you comment this string , there is almost no change in time
        ++iter;
   }
   sum+=t;
   ++i;
}

就这样。如果有人有任何想法,那就太好了。再一次非常感谢你。

真挚地
亚历克斯

最佳答案

不是故意的,不。除其他事项外,您不知道缓存有多大,因此您不知道将要容纳什么。此外,如果允许该应用程序锁定部分缓存,则对OS的影响可能会破坏整个系统的性能。这正好落在我的 list 上“您不能这样做,因为您不应该这样做。

您可以做的是改善引用的局部性-尝试安排循环,以使您不会多次访问元素,并尝试按顺序访问内存中的元素。

如果没有有关您的应用程序的更多线索,我认为无法给出更具体的建议。

10-05 18:06