我是靠谱客的博主 威武电脑,最近开发中收集的这篇文章主要介绍面试常见问题——估算运行时间,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


估算运行时间是一个面试的常见问题,我今天做了一个小实验,用快速排序算法排序,测试运行时间。


排序函数用的是C语言库的qsort,排序的数据类型为int,详细代码见后面的附录。


实验环境:linux64位操作系统,CPU:Intel 酷睿双核,T5750,主频2GHz。T5750是早期的CPU(笔记本在08年购买),虽然主频还过得去,但是根据网上的测试,i7的总体表现可以超过它10倍。

实验结果:

size of date 10 , time: 11 us
size of date 100 , time: 27 us
size of date 1000 , time: 497 us
size of date 10000 , time: 4180 us
size of date 100000 , time: 27330 us
size of date 1000000 , time: 316430 us
size of date 10000000 , time: 3662165 us

1 秒 = 1 000 000 us 

尝试给1亿个int数据排序,但是速度非常慢,所以最大的数据只有一千万,一千万个int只有40M的数据!

程序运行了多次,时间稳定,所以使用单次实验结果作为最终实验结果是大致可靠的(我只做数量级上的估算)。

大小为n的数据,用快速排序,时间复杂度为n*log(n),时间的单位为微秒,2GHz的CPU一个微秒有2000个周期(这个程序显然只在一个核上运行)。

最后计算:time * 2000 /  (n * log (n)),当n比较大时,基本稳定在50左右。

可以粗略得出下面的结论,给定大小为n的数据排序,需要的“比较”次数为n * log (n),每次“比较”消耗50个CPU主频周期,这个估算只在数量级上成立。



附录:实验用的C代码

#include<stdio.h>
#include "stdlib.h"
#include <sys/time.h>


inline int cmp (int * a, int * b) 
{
return (*a - *b );
}


int main(){
int *p;
int LENGTH = 10;
struct timeval start, end;
int j;
for (j=0; j < 7; j++, LENGTH *= 10) {
p = (int *) malloc ( LENGTH * sizeof (int) );
int i;
for (i = 0; i < LENGTH; i++) {
p[i] = rand();
//printf("%dn",p[i]);
}


gettimeofday( &start, NULL );


qsort(p, LENGTH, sizeof(int), cmp);


gettimeofday( &end, NULL );


int timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;

free(p);

//printf("size of date %d , time: %d usn", LENGTH, timeuse);
printf("%d   %d n", LENGTH, timeuse);
}
}



最后

以上就是威武电脑为你收集整理的面试常见问题——估算运行时间的全部内容,希望文章能够帮你解决面试常见问题——估算运行时间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部