【问题标题】:Runtime approximate formula for a program程序的运行时近似公式
【发布时间】:2013-11-28 01:10:51
【问题描述】:

我有一个 C 程序,对于以下数量的输入,它会在以下时间内执行:

23           0.001s            
100          0.001s          

我尝试为此找到一个公式,但没有成功。据我所知,时间有时会翻倍,有时不会,这就是为什么我找不到这个公式。

有什么想法吗?

注意事项

1) 我用 CPU 时间(用户+系统)来衡量这个。

2) 我的程序使用快速排序

2) 我的程序的渐近运行时分析/复杂度是 O(NlogN)

【问题讨论】:

  • 尝试确定运行时速度的公式将取决于机器,这就是为什么对源代码进行复杂性分析更合适。
  • 已经做了复杂度分析。我正在为我的程序使用快速排序,我的复杂性是 O(NlogN)
  • N
  • 您能否提供更多关于如何衡量执行时间的详细信息?您是在使用 CPU 时间还是喜欢从头到尾的系统时间?请记住,O(nlogn) 只是衡量的界限。
  • 好像time = 0.35µs * n 能胜任,对吧?

标签: c function time execution


【解决方案1】:

绘制此图看起来很像您正在触及“缓存悬崖” - 您的数据足够大,以至于它并不完全适合 cpu 缓存级别,因此必须在更便宜和更昂贵的级别之间交换数据

较低级别的差异可能是由于精确 - 如果您增加计时器块内的循环 - 这可能会平滑

通常当遇到缓存悬崖时,eprformace 类似于绘制 O*Q

其中 O 是平均运行时间——在您的情况下为 Nlog(N)

并且 Q 是一个阶跃函数,它随着您传递每个缓存的分配大小而增加。 所以 Q=1 低于 L1 尺寸,10 高于 L1 尺寸,100 高于 L2 尺寸等(仅以数字为例)

事实上,有些人通过绘制一个 O(1) 函数并寻找性能悬崖峭壁时使用的内存来验证他们的缓存大小:

           ___
 _____-----
  L1 | L2 | L3

【讨论】:

  • 如果无法确定正常公式,这个近似公式是什么?
  • @Danielle - 这回答了你的问题还是有其他问题?
【解决方案2】:

我总是用它来获得精确的运行时间..

#include<stdio.h>

#include <time.h>

#include <stdlib.h>

`clock_t startm, stopm;

`#define START if ( (startm = clock()) == -1) {printf("调用时钟错误");exit(1);}

`#define STOP if ( (stopm = clock()) == -1) {printf("错误调用时钟");exit(1);}

#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);

`int main() {

int i,x; 开始;

  scanf("%d",&x);
 for(i=0;i<10000;i++){
printf("%d\n",i);

}

 STOP;
 PRINTTIME;

}

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多