热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

测试一下我的电脑有多快

前言弄了一台DellXPS9570,4K屏。终于满足了我在高分屏下玩Linux桌面的愿望。我已经给这台电脑安装了最新的Ubuntu20.10,并进行了适当的美化。昨天,又折腾了一晚

前言

弄了一台 Dell XPS 9570, 4K屏。终于满足了我在高分屏下玩 Linux 桌面的愿望。我已经给这台电脑安装了最新的 Ubuntu 20.10,并进行了适当的美化。昨天,又折腾了一晚上 Vim,主要是配置了 YouCompleteMe 和 vim-airline,所以迫不及待地想写写代码找找手感。那就测试一下我的电脑能运行多快,计时的精度有多高吧,顺便看看,通过我自己手撸的快速排序算法,程序又能提速到多快。


Linux 下的计时及其精度

以前用的计时函数是 gettimeofday(),其精度可以达到毫秒。有一天我在翻看《Unix环境高级编程》的时候,发现里面提到,gettimeofday() 早就废弃不用了,现在推荐使用 clock_gettime() 函数,精度可以达到 1 纳秒。听起来都好诱人。

下面写个小程序测试一下,就是连续两次调用 clock_gettime() 函数,然后打印时间间隔,看我的电脑记一次时,最快能达到多少纳秒。程序如下:

#include
#include
#include
using namespace std;
void print_timer(struct timespec start, struct timespec end){
long timer = (end.tv_sec - start.tv_sec)*1000000000 + end.tv_nsec - start.tv_nsec;
cout < cout < cout < cout <}
int main(){
struct timespec start;
struct timespec end;
clock_gettime(CLOCK_REALTIME, &start);
clock_gettime(CLOCK_REALTIME, &end);
print_timer(start, end);
return 0;
}

本来写这篇文章就是想找找 Vim 的手感,所以必须来一张 Vim 的图片,如下:

运行结果如下:

从上面的结果可以看出,我的电脑计时的精度可以达到 348ns,真的好厉害。以后,我的所有需要测试程序运行时间的,都使用上面这样的模板代码。


测试对长度为 1000000 的数组进行排序的时间:1.冒泡排序

冒泡排序的代码我就不列出了,因为是在是太简单了,就是两重循环,其时间复杂度为 \(O(n^2)\) ,那么,我们测出的时间是多少呢?

2645,822,408,482 ns

两千多秒,也就是四十多分钟,实在是太慢了。


测试对长度为 1000000 的数组进行排序的时间:2.快速排序

当然,上面程序的慢是每一个算法书上都会提到的,所以我们需要使用更快的算法。我这里使用的是快速排序,其时间复杂度为 \(O(n\log{n})\) 。算法是我手撸的,如下:

#include
#include
#include
using namespace std;
const int ARR_LEN = 1000000;
template
void init_arr(T* a, int len){
for(int i=0; i a[i] = (T)rand();
}
}
template
void print_arr(T* a, int len){
if(len<10){
for(int i=0; i cout < }
cout < }else{
for(int i=0; i<5; i++){
cout < }
cout <<"... ";
for(int i=len-5; i cout < }
cout < }
}
template
void quick_sort(T* a, int len){
if(len<2)return;
if(len == 2){
if(a[0] > a[1]){
T temp = a[0];
a[0] = a[1];
a[1] = temp;
}
}

int i=0, left=0, right=len-1;
while(left while(a[right] > a[i] && left right--;
}
if(left T temp = a[right];
a[right] = a[i];
a[i] = temp;
i = right;
left ++;
}
while(a[left] left++;
}
if(left T temp = a[left];
a[left] = a[i];
a[i] = temp;
i = left;
right--;
}
}

quick_sort(a, i);
quick_sort(a+i+1, len-i-1);
}
void print_timer(struct timespec start, struct timespec end){
long timer = (end.tv_sec - start.tv_sec)*1000000000 + end.tv_nsec - start.tv_nsec;
cout < cout < cout < cout <}
int main(){
int* a = (int*)malloc(sizeof(int)*ARR_LEN);
init_arr(a, ARR_LEN);
print_arr(a, ARR_LEN);
struct timespec start;
struct timespec end;
clock_gettime(CLOCK_REALTIME, &start);
quick_sort(a, ARR_LEN);
clock_gettime(CLOCK_REALTIME, &end);
print_arr(a, ARR_LEN);
print_timer(start, end);
return 0;
}

编译,运行。它的时间是多少呢?

000,123,209,970 ns

也就是 123ms,比冒泡排序足足提速两万一千五百多倍。我的天哪!看来算法还是非常重要的呀。


测试对长度为 1000000 的数组进行排序的时间:3.使用多线程的快速排序

这是最快的速度了吗?显然不是,我的电脑 CPU 可是 6 核 12 线程的。不充分利用多核优势怎么对得起自己。我上面的快速排序算法使用的是递归,那么使用 OpenMP 就没戏了(主要是我自己水平太菜,没找到递归算法的 OpenMP 写法)。那么只好自己写 thread 了,好在是自从 C++ 11 之后,写 thread 也很简单。我的方法就是在 quick_sort() 函数中判断一下待排序的数组的长度,如果待排序的数组的长度大于总数组长度的 1/8,就在新创建的线程里递归调用 quick_sort(),否则就直接递归调用 quick_sort()。如下图:

编译,运行。它的时间是多少呢?

000,040,038,803 ns

速度再次提升三倍,终于使时间达到了 40ms 的级别。这可能就是我的电脑和我本人的水平所能达到的最快速度吧。

下面是运行截图:


总结

电脑很 NB,Linux 的计时器也很 NB,算法很 NB,配置了 YouCompleteMe 和 vim-airline 的 Vim 也很 NB。


版权申明

该随笔由京山游侠在2021年05月16日发布于博客园,引用请注明出处,转载或出版请联系博主。QQ邮箱:1841079@qq.com



推荐阅读
  • 本文介绍了如何通过安装 rpm 包来使用 resize2fs 和 ext2online 工具进行系统文件的扩容。提供了详细的步骤和注意事项。 ... [详细]
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • Linux系统中默认安装目录有哪些?Tomcat在Linux下的默认安装路径是什么?
    在Linux系统中,默认安装目录通常包括 `/usr`, `/opt`, 和 `/var` 等。对于Tomcat而言,在Linux下的默认安装路径通常是 `/opt/tomcat` 或者 `/usr/local/tomcat`。具体路径可能会因不同的发行版和配置而有所差异。例如,在Ubuntu Server中,Tomcat的默认安装路径通常是 `/opt/tomcat`。这些目录的选择旨在确保系统的整洁性和可维护性。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • FreeBSD环境下PHP GD库安装问题的详细解决方案
    在 FreeBSD 环境下,安装 PHP GD 库时可能会遇到一些常见的问题。本文详细介绍了从配置到编译的完整步骤,包括解决依赖关系、配置选项以及常见错误的处理方法。通过这些详细的指导,开发者可以顺利地在 FreeBSD 上完成 PHP GD 库的安装,确保其正常运行。此外,本文还提供了一些优化建议,帮助提高安装过程的效率和稳定性。 ... [详细]
  • 本文详细介绍了Linux系统中用于管理IPC(Inter-Process Communication)资源的两个重要命令:ipcs和ipcrm。通过这些命令,用户可以查看和删除系统中的消息队列、共享内存和信号量。 ... [详细]
  • 如何为Station主机创建Ubuntu启动卡
    本文详细介绍了如何为Station主机创建Ubuntu启动卡,包括所需的工具和步骤,帮助用户轻松实现系统的快速切换。 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 如何在Windows内置的Ubuntu系统中更改SSH服务的端口号设置
    如何在Windows内置的Ubuntu系统中更改SSH服务的端口号设置 ... [详细]
  • 在《天天酷跑》中,腾讯微信宠物的升级技巧和策略对于提升游戏体验至关重要。本文详细解析了如何通过合理分配经验和资源,快速提升宠物等级,以及如何选择合适的宠物搭配,以增强角色的综合能力。此外,还介绍了游戏中的一些隐藏机制和优化建议,帮助玩家更好地利用微信宠物的优势,提高游戏成绩。 ... [详细]
  • 当PHP中的tempnam()函数被禁用后的应对策略与解决方案
    当 PHP 中的 `tempnam()` 函数被禁用时,开发者需要采取相应的替代方案以确保应用程序的正常运行。本文探讨了多种应对策略,包括使用 `sys_get_temp_dir()` 结合自定义文件命名方法,以及利用第三方库来生成临时文件。此外,还详细介绍了如何在不同操作系统和服务器环境中配置临时文件路径,以提高代码的兼容性和安全性。 ... [详细]
author-avatar
深圳市互联网大会
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有