C 与单进程场景相比,多进程场景中的访问时间意外降低

C 与单进程场景相比,多进程场景中的访问时间意外降低,c,performance,gcc,performance-testing,cpu-architecture,C,Performance,Gcc,Performance Testing,Cpu Architecture,我正在从program1访问共享库(共享阵列数据结构),并找到读取该阵列所有元素的访问时间。我得到了大约17000个滴答声,而只有Program1单独执行 现在,当我首先在另一个选项卡中执行program2(使用empty while循环来保持它从终止状态),然后运行program1并测量读取该数组所有元素的访问时间。 令我惊讶的是,与之前只有Program1执行的场景相比,现在我得到了8000个ticks 看起来,当只有program1在执行时,与有2个程序时相比,读取数组需要更多的时间,pr

我正在从program1访问共享库(共享阵列数据结构),并找到读取该阵列所有元素的访问时间。我得到了大约17000个滴答声,而只有Program1单独执行

现在,当我首先在另一个选项卡中执行program2(使用empty while循环来保持它从终止状态),然后运行program1并测量读取该数组所有元素的访问时间。 令我惊讶的是,与之前只有Program1执行的场景相比,现在我得到了8000个ticks

看起来,当只有program1在执行时,与有2个程序时相比,读取数组需要更多的时间,program1执行与前一个相同的任务,program2通过while循环使CPU保持忙碌。在有program1的情况下,预期的访问时间会更长,而实际结果则相反

为什么会这样

这里是共享图书馆

#include <stdio.h> 
static const int DATA[1024]={1 ,2 ,3,.....1024];
inline void foo(void)
{
    int j, k=0,count=0;

    for(j=0;j<1024;j++)
      {
        k=DATA[j];
      }

    k+=0;    
}
计划2

   int main(void)
    {
    while(1)
        {}        
    return 0;
    }
案例1(仅程序1正在运行)

输出

Time1=17918
Time2=17672  
Time3=17816  

after sleep(1)
**Time4= 20716 ** // Is it due to wake up from sleep mode ?
Time5=17722

after sleep(2)
**Time6=20910** // Is it due to wake up from sleep mode ?
Time1 =7483  
Time2=7205
Time3=7399

after sleep(1)
**Time4= 8734 ** // Is it due to wake up from sleep mode ?
Time5=7326

after sleep(2)
**Time6=9070** // Is it due to wake up from sleep mode ?
Time1=75186246
Time2=77570299 
Time3=80548529 

after sleep(1)
**Time4= 92608363 ** // Is it due to wake up from sleep mode ?
Time5=75616487

after sleep(2)
**Time6=97021338** // Is it due to wake up from sleep mode ?
Time1 =139337099 
Time2=155801957
Time3=146586856

after sleep(1)
**Time4= 130558062 ** // Why lower access time after sleep mode ?
Time5=145250551 // Time5 is expected lower than Time4 as other run . Why lower here ?

after sleep(2)
**Time6=130940183** // Again Why lower access time after sleep mode ?
案例1(程序2先运行,然后程序1开始运行)

输出

Time1=17918
Time2=17672  
Time3=17816  

after sleep(1)
**Time4= 20716 ** // Is it due to wake up from sleep mode ?
Time5=17722

after sleep(2)
**Time6=20910** // Is it due to wake up from sleep mode ?
Time1 =7483  
Time2=7205
Time3=7399

after sleep(1)
**Time4= 8734 ** // Is it due to wake up from sleep mode ?
Time5=7326

after sleep(2)
**Time6=9070** // Is it due to wake up from sleep mode ?
Time1=75186246
Time2=77570299 
Time3=80548529 

after sleep(1)
**Time4= 92608363 ** // Is it due to wake up from sleep mode ?
Time5=75616487

after sleep(2)
**Time6=97021338** // Is it due to wake up from sleep mode ?
Time1 =139337099 
Time2=155801957
Time3=146586856

after sleep(1)
**Time4= 130558062 ** // Why lower access time after sleep mode ?
Time5=145250551 // Time5 is expected lower than Time4 as other run . Why lower here ?

after sleep(2)
**Time6=130940183** // Again Why lower access time after sleep mode ?
据我所知,当CPU仅由program1使用时,读取数组所需的时间必须少于program1和program2使用CPU时所需的时间

我在哪里犯错?我有i7机器,只有一个核心,超线程被禁用,ASLR被禁用

编辑1:

根据Mystical的建议,我的CPU进入省电模式,而只有program1在那里,所以CPU进入省电模式,然后从省电模式中唤醒它需要更长的访问时间。所以他的建议是多次访问数据数组

这是我修改过的共享库。程序1和程序2不变

#include <stdio.h> 
static const int DATA[1024]={1 ,2 ,3,.....1024];
inline void foo(void)
{
    int j, k=0,count=0;
  while(count++<10000)
  {  
    for(j=0;j<1024;j++)
      {
        k=DATA[j];
      }
   }  
    k+=0;    
}
案例1(程序2先运行,然后程序1开始运行)

输出

Time1=17918
Time2=17672  
Time3=17816  

after sleep(1)
**Time4= 20716 ** // Is it due to wake up from sleep mode ?
Time5=17722

after sleep(2)
**Time6=20910** // Is it due to wake up from sleep mode ?
Time1 =7483  
Time2=7205
Time3=7399

after sleep(1)
**Time4= 8734 ** // Is it due to wake up from sleep mode ?
Time5=7326

after sleep(2)
**Time6=9070** // Is it due to wake up from sleep mode ?
Time1=75186246
Time2=77570299 
Time3=80548529 

after sleep(1)
**Time4= 92608363 ** // Is it due to wake up from sleep mode ?
Time5=75616487

after sleep(2)
**Time6=97021338** // Is it due to wake up from sleep mode ?
Time1 =139337099 
Time2=155801957
Time3=146586856

after sleep(1)
**Time4= 130558062 ** // Why lower access time after sleep mode ?
Time5=145250551 // Time5 is expected lower than Time4 as other run . Why lower here ?

after sleep(2)
**Time6=130940183** // Again Why lower access time after sleep mode ?
以下是我关于修改后的共享库的新问题

  • 当没有程序2时,与之前的访问时间(t3/t5,进入睡眠前)相比,睡眠后访问时间(t4/t6)更高。我可以说,这是因为从睡眠中醒来的CPU,正如神秘的解释

  • 现在,当program2在另一个选项卡中运行时,睡眠后访问时间(t4/t6)比之前的访问时间(t3/t5,睡觉前)低。我的问题(1)和问题(2)的原因是矛盾的。从睡眠中醒来(t4

  • 为什么
    t2以下是我的推测性答案,这些答案似乎已在评论中得到证实:

    在原始基准测试中,每个测试只运行一次迭代。因此,基准测试的运行时间不足以“平均”所有随机性

    当您自己运行program1时,它需要将CPU从省电状态唤醒。这需要时间,并且可能导致运行时间更长

    当您同时运行两个程序时(首先从program2开始),program2会提前将CPU踢出节能状态。因此,运行program1时,此预热惩罚未实现



    一旦循环基准测试花费更长的时间,这种预热代价就变得无关紧要了,您最终可以看到代码的预期稳态性能。(program1本身速度更快)

    除非运行多次迭代,否则基准测试几乎毫无意义。(足够的迭代次数,使基准测试持续几秒钟而不是瞬间。)正如单次迭代一样,您可能看到了program2迫使CPU退出省电状态的效果。@感谢您的回答。你的意思是说,当我使用单次迭代读取相同的阵列时,CPU进入省电状态,这就是为什么我获得了更高的访问时间(17000次)。当Program2使用while循环并使CPU繁忙时,它会阻止CPU进入节能状态。也许你是对的,因为当我在程序2中使用sleep(100)时,我也得到了更高的访问时间(17000个滴答声)。让我检查多次迭代,然后将结果发布在这里。@Mysticial我通过多次迭代(10000)获得了预期的结果(当program2处于场景中时,访问时间更长)。你能把这个写下来作为回答,这样我就可以接受了。谢谢。因为你已经有了一个相关的问题(有一些答案),如果有一些有用的信息,可以链接到那里。循环迭代+1,但我不确定电源状态。除非程序与同一个内核密切相关,否则它们可能在不同的内核上运行,而这些内核可以分别进入和退出电源状态(除非您具有这种粒度,否则这些电源状态没有多大意义,因为另一个内核将不喜欢动态turbo).@Leeor在我的机器中,我禁用了其他核心和超线程。@bholanath TBH,在你的新基准测试的program2+program1案例中,噪音太大,我真的无法得出相同的结论。据我所知,它们在变化中都是一样的。@神秘的TBH是什么?另一点是,如果您看到访问时间,则访问时间的组合会更低/更高。没有遵循任何模式。就像从主存访问时第一次访问时间较高一样,从缓存访问时连续访问时间也较低。我在这里得到的(使用/使用同一阵列的多个访问)有时我得到的访问时间比以前的(如预期的)要短,但有时晚些时候会得到更高的访问时间(预期的访问时间较低,为什么要更高的访问时间?)。您有
    Time1=139337099
    Time2=1