打印C++程序运行时间(毫秒和微秒两个版本)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

问题引入

一、一般计时方法

二、精确计时方法


问题引入

       在C++程序的性能分析中,其中重要的一项就是程序的运行时间。虽然程序的运行速度与计算机的配置、计算机的当前状态等有很大关系,但在相对一致的外部环境下,程序运行时间的长短在很大程度上是可以反映程序效率的。

一、一般计时方法

       在ctime头文件中,C++提供了计时函数 clock() ,其返回数据类型为 clock_t。

typedef   long   clock_t;

        clock()函数返回从“开启程序进程”到“程序中调用clock()函数”这段时间里,CPU时钟计时单元(clock tick)的数目,在MSDN中称之为挂钟时间(wal-clock)。
       在ctime文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒内有多少个CPU时钟计时单元。
       通过clock()/CLOCKS_PER_SEC便可以得到进程的运行时间,一般CLOCKS_PER_SEC的值为1000,可见计时精度可达小数点后3位(毫秒级)。

/*
	随机生成数组,并用冒泡排序处理数据,计算程序运行时间,评估算法的效率。
*/
#include <iostream>
#include <ctime>
using namespace std;

int a[100000];

//定义clock_t变量,估算循环运行时间 

void bubble_sort(int a[], int n) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - i - 1; j++) {
			if (a[j]>a[j+1]) {
				swap(a[j], a[j + 1]);
			}
		}
	}
}


int main() {
	int n;
	cin>>n;
	srand(time(0));
	for(int i = 0;i<n;i++){
		a[i] = rand() % 1000 + 1;
	}
	cout<<"-----------------排序前-----------------"<<endl;
	for(int i = 0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	cout<<"-----------------排序后-----------------"<<endl;
	clock_t begin,end;
	begin = clock();
	bubble_sort(a,n);//计算排序需要多长时间
	end = clock();
	for(int i = 0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	cout<<"-----------------排序用时(ms)-----------------"<<endl;
	cout<<end - begin;
	return 0;
}

二、精确计时方法

       这里精确的含义是计时的精度更高,使用QueryPerformanceCounter()和QueryPerformanceFrequency(),计算机从硬件上支持精确定时器。
QueryPerformanceCounter()函数返回高精确度计数器的脉冲数目(计时数),QueryPerformanceFrequency()函数提供了高精度计时器的频率值,即每秒脉冲数。

/*
	随机生成数组,并用冒泡排序处理数据,计算程序运行时间,评估算法的效率。
*/
#include <algorithm>
#include<windows.h>
#include <iostream>
#include <ctime>
using namespace std;

int a[100000];

//定义clock_t变量,估算循环运行时间 

void bubble_sort(int a[], int n) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - i - 1; j++) {
			if (a[j]>a[j+1]) {
				swap(a[j], a[j + 1]);
			}
		}
	}
}


int main() {
	int n;
	cin>>n;
	LARGE_INTEGER nFreq;
	LARGE_INTEGER t1;
	LARGE_INTEGER t2;
	LARGE_INTEGER t3;
	LARGE_INTEGER t4;
	double dt;
	QueryPerformanceFrequency(&nFreq);
	srand(time(0));
	for(int i = 0;i<n;i++){
		a[i] = rand() % 1000 + 1;
	}
	cout<<"-----------------排序前-----------------"<<endl;
	for(int i = 0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	cout<<"-----------------排序后-----------------"<<endl;
//	clock_t begin,end;
//	begin = clock();
	QueryPerformanceCounter(&t1);
	bubble_sort(a,n);//计算排序需要多长时间
	QueryPerformanceCounter(&t2);
//	end = clock();
	for(int i = 0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
//	cout<<"-----------------排序用时(ms)-----------------"<<endl;
	cout<<"-----------------排序用时(us)-----------------"<<endl;
	dt = (t2.QuadPart - t1.QuadPart) / (double)nFreq.QuadPart;
	cout << "Running time :" << dt * 1000000 << "us" << endl;//dt
//	cout<<end - begin;
	return 0;
}

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c语言遍历文件夹的方法如下: 1. 使用opendir函数打开文件夹, 并使用readdir函数读取文件夹中的文件名。 2. 使用循环遍历文件夹中的所有文件。 3. 对于每一个文件, 使用stat函数获取文件的信息, 包括文件类型(是否是文件夹)。 4. 如果是文件夹, 递归调用此函数, 进入新的文件夹继续遍历。 5. 当文件夹遍历完毕后, 使用closedir函数关闭文件夹。 下面是一个示例代码: ``` #include <stdio.h> #include <dirent.h> #include <sys/stat.h> void listdir(const char *name) { DIR *dir; struct dirent *entry; if (!(dir = opendir(name))) return; while ((entry = readdir(dir)) != NULL) { struct stat st; char path[1024]; snprintf(path, sizeof(path), "%s/%s", name, entry->d_name); if (lstat(path, &st) == -1) continue; if (S_ISDIR(st.st_mode)) { if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; printf("%*s[%s]\n", indent, "", entry->d_name); listdir(path); } else printf("%*s- %s\n", indent, "", entry->d_name); } closedir(dir); } int main() { listdir("."); return 0; } ``` 希望这个示例代码能够帮助你理解文件夹遍历的方法。 ### 回答2: 遍历文件夹指的是以某种方式遍历文件夹中的所有文件和子文件夹。在计算机编程中,常用的遍历文件夹的方法包括递归和迭代。 递归遍历文件夹是一种深度优先的方式。这种方法会从根文件夹开始,首先获取当前文件夹中的所有文件和子文件夹。然后,对于每个子文件夹,再递归调用遍历文件夹方法,重复上述步骤,直到遍历到最底层的文件夹。这种方式可以确保遍历到文件夹中的每个文件和子文件夹,但可能会消耗较多的内存。 迭代遍历文件夹是一种广度优先的方式。这种方法会使用一个队列来存储待遍历的文件夹。开始时,将根文件夹入队。然后,从队列中取出一个文件夹,获取其中的所有文件和子文件夹,并将它们入队。重复上述步骤,直到队列为空。这种方式可以逐层遍历文件夹,较递归方式占用较少的内存。 在实际编程中,可以根据具体需求选择适合的遍历文件夹的方法。递归方式相对简单,但可能导致栈溢出或死循环等问题。迭代方式相对复杂,但可以灵活控制遍历的深度和顺序。无论选择哪种方式,遍历文件夹都是访问文件系统中重要内容的基本操作之一。 ### 回答3: 遍历文件夹是指对指定的文件夹进行逐个查找和检索其中的文件和子文件夹的过程。 在计算机编程中,实现文件夹遍历通常需要使用递归算法。具体步骤如下: 1. 首先,我们需要指定一个顶层文件夹作为起始点。可以是任意一个已存在的文件夹。 2. 然后,我们通过读取起始文件夹的内容(包括文件和子文件夹),获取这些内容的相关信息,例如文件名、文件类型、文件大小等。 3. 对于每一个子文件夹,我们将重复步骤2,进一步查找其中的文件和子文件夹。这就是递归的过程,直到遍历到最底层的文件夹。 4. 遍历文件夹的过程中,可以根据需要进行文件的筛选,例如只处理某些特定类型的文件。 5. 最后,我们可以对遍历到的每一个文件进行自定义的操作,例如打印文件路径、复制文件、修改文件等。 通过遍历文件夹,我们可以方便地获取指定文件夹下的所有文件,对其进行批量处理,例如备份、删除、搜索等。这在文件管理、数据处理和程序开发中都是常见的应用场景。 需要注意的是,对于大型文件夹或者文件夹层级很深的情况下,可能会遇到性能问题,因此在实际开发时需要进行优化,例如通过并行处理来提高遍历速度,避免资源浪费和耗时过长。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值