如何放慢流程?

时间:2010-02-07 08:15:52

标签: c performance

假设我有一个程序在给定的时间内运行(比方说,三秒钟)。我想运行这个程序,使其运行速度慢n倍(在命令行中指定)。如何通过(或更好,没有)改变程序来实现它?

请注意,最后添加睡眠不是解决方案。该程序必须运行较慢,不要在前三秒内全速运行,然后在剩余时间内不执行任何操作。另外,在unix下使用“nice”也不是一个好的解决方案。如果其他进程需要处理器,它将运行得更慢,但如果同时没有任何处理器要求,则会全速运行。

这是一个好奇心问题。没有什么可以做的与之相关。事实是,我记得15到20年前的游戏太快而无法在新处理器上播放,因为它们与处理器时钟同步。你必须关掉涡轮增压器。

我们假设该程序是一个C编译程序。

5 个答案:

答案 0 :(得分:5)

一个想法就是写一个'ptrace runner'。 ptrace是允许您在Linux和Mac等平台上实现调试器的调用。

想法是附加到程序,然后反复告诉应用程序使用ptrace(PTACE_SINGLESTEP)运行一条指令。如果这还不够慢,你可以在跑步者计划中每次调用ptrace之间添加一个睡眠。

答案 1 :(得分:5)

我在linux盒子上写了一个简单的例子,如何使用SIGSTOP和SIGCONT信号减慢子进程的速度:

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

void dosomething(void){
  static volatile unsigned char buffer[1000000];
  for(unsigned i=0;i<1000;i++) for(unsigned j=0;j<sizeof(buffer);buffer[j++]=i){;}
}

#define RUN  1
#define WAIT 1

int main(void){
  int delay=0, status, pid = fork();
  if( !pid ){ kill(getpid(),SIGSTOP); dosomething(); return 0; }
  do{
    waitpid( pid, &status, WUNTRACED | WCONTINUED );
    if( WIFSTOPPED  (status)         ){ sleep(delay); kill(pid,SIGCONT); }
    if( WIFCONTINUED(status) && WAIT ){ sleep(RUN  ); kill(pid,SIGSTOP); }
    delay=WAIT;
  }while( !WIFEXITED(status) && !WIFSIGNALED (status) );
}

WAIT为零时不会减速,否则在每RUN秒之后,父级会将孩子停在WAIT秒。

运行时结果:

RUN=1 WAIT=0
---------------
real     3.905s
user     3.704s
sys      0.012s

RUN=1 WAIT=1
---------------
real     9.061s
user     3.640s
sys      0.016s

RUN=1 WAIT=2
---------------
real    13.027s
user     3.372s
sys      0.032s

答案 2 :(得分:2)

cpulimit是一个可以做到这一点的工具。它通过定期 kill -STOPkill -CONT进程运行,这会使其运行速度变慢(平均随时间变化)。

答案 3 :(得分:0)

如果你有DTrace,你可以使用它的 chill()功能。您可以在用户空间应用程序中的多个位置和多个位置插入此寒意。以前用它来复制在较慢系统上看到的竞争条件。

答案 4 :(得分:-6)

我在ubuntu下的虚拟机中运行了一些应用程序。这真的很慢。 您可以配置系统的虚拟机使用情况。

您可以通过在虚拟机下的虚拟机下运行虚拟机来进一步模糊这种情况,...