我已经做了一段时间的爱好项目(用C语言编写),但还远未完成.它非常重要,它会很快,所以我最近决定做一些基准测试来验证我解决问题的方法效率不高.

$time ./old

real 1m55.92

user 0m54.29

sys 0m33.24

我重新设计了程序的一部分,以显着删除不必要的操作,减少内存缓存未命中和分支错误预测.精彩的Callgrind工具向我展示了越来越多令人印象深刻的数字.大多数基准测试都是在不分支外部流程的情况下完成的.

$time ./old --dry-run

real 0m00.75

user 0m00.28

sys 0m00.24

$time ./new --dry-run

real 0m00.15

user 0m00.12

sys 0m00.02

显然我至少做对了.然而,运行真实的程序讲述了一个不同的故事.

$time ./new

real 2m00.29

user 0m53.74

sys 0m36.22

您可能已经注意到,时间主要取决于外部流程.我不知道是什么导致了回归.它没什么好奇怪的;只是一个传统的vfork / execve / waitpid由一个线程完成,以相同的顺序运行相同的程序.

有些东西必须导致分支变慢,所以我做了一个小测试(类似于下面的测试)只会产生新进程并且不会产生与我的程序相关的开销.显然这必须是最快的.

#define _GNU_SOURCE

#include

我猜不会.

这时我决定投票给州长表现,时间变得更好了:

$for i in 0 1 2 3 4 5 6 7; do sudo sh -c "echo performance > /sys/devices/system/cpu/cpu$i/cpufreq/scaling_governor";done

$time ./test

real 1m03.44

user 0m29.30

sys 0m10.66

似乎每个新进程都安排在一个单独的核心上,并且它需要一段时间才能切换到更高的频率.我不能说为什么旧版本跑得更快.也许这很幸运.也许它(由于效率低下)导致cpu更早地选择更高的频率.

改变调控器的一个很好的副作用是编译时间也得到了改善.显然编译需要许多新流程.但这不是一个可行的解决方案,因为这个程序必须在其他人的台式机(和笔记本电脑)上运行.

我发现改善原始时间的唯一方法是通过在开头添加此代码将程序(和子进程)限制为单个cpu:

cpu_set_t mask;

cpu_ZERO(&mask);

cpu_SET(0,&mask);

sched_setaffinity(0,sizeof(mask),&mask);

尽管使用默认的“ondemand”调控器,这实际上是最快的:

$time ./test

real 0m59.74

user 0m29.02

sys 0m10.67

它不仅是一个hackish解决方案,而且在启动的程序使用多个线程的情况下也不能很好地工作.我的程序无法知道这一点.

有没有人知道如何让产生的进程以高cpu时钟频率运行?它必须是自动化的,不需要su priviliges.虽然到目前为止我只在Linux上测试了这个,但我打算将它移植到或多或少所有流行和不受欢迎的桌面操作系统(它也将在服务器上运行).欢迎任何平台上的任何想法.

linux如何增加一个进程,linux – 如何增加新生成进程的CPU频率相关推荐

  1. linux重新启动某一个项目,Linux运维知识之supervisor更改某项目配置后 需要重新启动才有效...

    本文主要向大家介绍了Linux运维知识之supervisor更改某项目配置后 需要重新启动才有效,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 在linux服务器上部署了nod ...

  2. linux cut 最后一个字符,linux - 如何使用'cut'找到最后一个字段

    linux - 如何使用'cut'找到最后一个字段 不使用sed或awk,仅使用cut,如果字段数未知或每行更改,如何获取最后一个字段? noobcoder asked 2019-03-15T12:4 ...

  3. linux取消上一个命令,Linux简介及最常用命令(简单易学,但能解决95%以上的问题)...

    Linux是目前应用最广泛的服务器操作系统,基于Unix,开源免费,由于系统的稳定性和安全性,市场占有率很高,几乎成为程序代码运行的最佳系统环境.linux不仅可以长时间的运行我们编写的程序代码,还可 ...

  4. linux下的CPU频率管理器

    今日,查看资料,方知在linux下有一个用于移动设备省电用的:CPU频率调整器. 在百度里,没有找到详细的说明资料,可把此事当做课题,留待以后研究. 转载于:https://blog.51cto.co ...

  5. Linux 进程(一) 进程概念和进程状态(僵尸进程、孤儿进程、守护进程)

    进程的概念 进程状态 僵尸进程.孤儿进程.守护进程 进程的概念 程序:一系列有序的指令集合(就是我们写的代码) 进程:进程就是程序的一次执行,是系统进行资源分配和调度的独立单位. 程序是一个没有生命的 ...

  6. nginx关闭所有进程linux,linux nginx启动,重启,关闭命令

    启动操作 /usr/local/nginx/conf/nginx 停止操作 停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的 步骤1:查询nginx主进程号 ps - ...

  7. linux 多域名访问数据库,Linux下虚拟域名的实现

    目前Linux操作系统十分火爆,所以很多朋友希望了解一下Linux下虚拟域名的实现过程.下面就基于目前比较流行的RedHat来讨论一下. 一.DNS服务器的设置 我们知道互联网网是基于TCP/IP协议 ...

  8. linux nginx php 启动命令,linux nginx启动,重启,关闭命令

    启动操作 nginx -c /usr/local/nginx/conf/nginx.conf -c参数指定了要加载的nginx配置文件路径 停止操作 停止操作是通过向nginx进程发送信号(什么是信号 ...

  9. Kali Linux又增加一个顶级域名kali.download

    Kali Linux又增加一个顶级域名kali.download 现阶段,kali.download只提供软件包和镜像下载.大家可以把该域名作为备选软件源来使用.形式如下: deb  http://k ...

最新文章

  1. JS window.open()属性
  2. Xilinx ISE 开发过程中生成的各种文件(一)
  3. JSP 页面传值方法总结
  4. ADO.NET开发总结(学习笔记)
  5. JSON 序列化与反序列化:使用TypeReference 构建类型安全的异构容器
  6. Storyboard中segue使用总结
  7. 牛客网剑指offer编程实践11-20题
  8. 南京大学c语言试卷,2007年4月南京大学C语言期中试题.doc
  9. 《Oracle DBA工作笔记》第一章
  10. xen-tools创建虚拟机找不到root fs的解决办法
  11. 使用Java语言开发微信公众平台(五)——获取access_token
  12. 苹果电脑驱动下载查询
  13. android int 字节数组,android 将int转byte,byte转int的两种方法
  14. WM6电话簿转到Android系统
  15. java 调用打印机打印PDF文件
  16. git 强制拉取最新代码
  17. Discuz showWindow函数解析
  18. QTP Reporter类封装
  19. 集成电路设计那些事儿
  20. 阿里张勇:针对平台经济的管理非常及时和必要|钛媒体直击乌镇

热门文章

  1. anime studio的本质特性
  2. 关于使用 Python 析构函数的正确姿势
  3. Dubbo(四) 消费者、提供者工程搭建并使用注解实现远程调用
  4. ZooKeeper(一)linux上单机与集群的搭建
  5. spark SortShuffleWriter的实现
  6. sql server远程主机强迫关闭了一个_交换机远程端口镜像
  7. Java面试题:高并发环境下,jdk7 HashMap可能出现的致命问题。注意:是在jdk7与及以下版本
  8. mysql 关于binlog的一些命令
  9. Spring Cloud Sleuth 原理简介和使用
  10. JDK动态代理实现原理详解(源码分析)