小编tor*_*rso的帖子

如何提高新生成进程的CPU频率

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

$ time ./old
real 1m55.92
user 0m54.29
sys 0m33.24
Run Code Online (Sandbox Code Playgroud)

我重新设计了程序的一部分,以显着删除不必要的操作,减少内存缓存未命中和分支错误预测.精彩的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
Run Code Online (Sandbox Code Playgroud)

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

$ time ./new
real 2m00.29
user 0m53.74
sys 0m36.22
Run Code Online (Sandbox Code Playgroud)

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

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

#define _GNU_SOURCE
#include <fcntl.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, const char **argv)
{
    static const char *const _argv[] = {"/usr/bin/md5sum", "test.c", 0};

    int fd = open("/dev/null", O_WRONLY);
    dup2(fd, STDOUT_FILENO);
    close(fd);

    for (int i = …
Run Code Online (Sandbox Code Playgroud)

linux performance fork scheduling

6
推荐指数
1
解决办法
440
查看次数

标签 统计

fork ×1

linux ×1

performance ×1

scheduling ×1