V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Deardrops
V2EX  ›  Linux

为什么同一段代码在 Linux 内核态比用户态执行的效率高?

  •  1
     
  •   Deardrops ·
    deardrops · 2019-06-03 14:45:49 +08:00 · 6695 次点击
    这是一个创建于 2001 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Linux 实验作业,用普通函数和系统调用函数分别实现一个加法函数,分别运行几十万次记录总执行时间,

    • 普通函数:661 msec
    • 系统调用函数:2 usec

    请问为什么内核态的代码执行效率更高?这里没有涉及到用户态与内核态切换

    初学 Linux,也看了一些书和博客,知道是什么没搞明白为什么,有大佬能指点一下么?

    23 条回复    2019-06-03 23:32:43 +08:00
    tomychen
        1
    tomychen  
       2019-06-03 15:00:46 +08:00
    你可以分别再试一下别的,比如文件操作

    (f)open / f(read) / f(write)

    大开多个 fd 和读写不同大小的文件
    lsp7572
        2
    lsp7572  
       2019-06-03 15:22:13 +08:00
    进程优先级不同吧,内核的优先级高点
    xupefei
        3
    xupefei  
       2019-06-03 15:30:19 +08:00 via iPhone
    代码写的有问题吧,性能哪能差这么多。
    usingnamespace
        4
    usingnamespace  
       2019-06-03 15:41:35 +08:00 via iPhone
    把你测试用的代码放出来啊
    应该是用 c 测的吧 有时候你只要包含了头文件都会多很多系统调用 把代码放上来看
    Deardrops
        5
    Deardrops  
    OP
       2019-06-03 16:56:12 +08:00
    回复需要手机号验证,我在 github 上创建了一个 repo:github.com/Deardrops/system-program-lab2
    Deardrops
        6
    Deardrops  
    OP
       2019-06-03 16:57:45 +08:00
    @usingnamespace @xupefei 源码已上传 github,楼上的链接里
    letianqiu
        7
    letianqiu  
       2019-06-03 17:24:51 +08:00
    应该测的是程序消耗的 CPU 时间。
    verrickt
        8
    verrickt  
       2019-06-03 17:31:31 +08:00 via Android   ❤️ 1
    无责任猜测,user mode 里的 printf 用到了 syscall,发生了用户态到内核态的切换。
    misaka19000
        9
    misaka19000  
       2019-06-03 17:35:24 +08:00
    期待有大佬能够解答
    siteshen
        10
    siteshen  
       2019-06-03 17:39:34 +08:00
    为什么一个是 c++ 代码,一个是 c 代码?把能控制的变量控制了,再进行比较啊(我也不知道 c, c++ 性能孰优孰劣,但使用相同的编译器是能让比较更有针对性的)。
    pinecone
        11
    pinecone  
       2019-06-03 17:47:59 +08:00
    个人觉得 verrickt 说的很有道理。printf 和 printk 的差别。
    lff0305
        12
    lff0305  
       2019-06-03 17:59:59 +08:00   ❤️ 1
    测试了下普通的,如果是编译的时候什么参数都不加是 300 多毫秒。加上-O3 就变成 0 毫秒了。看看是不是你的编译参数的问题。因为 operation 函数对 result 的操作,所有前面的都是没有意义的,只有最后一个有意义,那么编译器完全可以进行优化
    Deardrops
        13
    Deardrops  
    OP
       2019-06-03 18:11:01 +08:00 via Android
    @lff0305 自动优化这点以前没有想到,我按照这个思路再排查一下,谢谢你的建议
    0ZXYDDu796nVCFxq
        14
    0ZXYDDu796nVCFxq  
       2019-06-03 18:17:40 +08:00 via Android
    一般来说,各种语言的 print 性能损耗都挺大
    Deardrops
        15
    Deardrops  
    OP
       2019-06-03 18:24:33 +08:00 via Android
    仔细看下代码的话,其实普通函数版本在开始记时到结束记时的范围内,并没有 printf 语句哦。因此 printf 和 printk 函数并不是影响执行效率的主要原因。
    glogo
        16
    glogo  
       2019-06-03 18:30:32 +08:00
    什么代码?
    yangzhezjgs
        17
    yangzhezjgs  
       2019-06-03 18:33:12 +08:00
    我觉得 ftime 这个函数调用的时候也会发生系统调用,因为获取系统时钟应该是要访问内核的
    shylockhg
        18
    shylockhg  
       2019-06-03 18:49:26 +08:00
    兄弟获取时间不要 syscall,你确定么。。。
    goreliu
        19
    goreliu  
       2019-06-03 18:54:08 +08:00 via Android
    可能是两边优化程度不一样导致的。运行的正常分支走不到 print,获取时间单个函数的调用耗时很少,不会有那么大影响。
    shylockhg
        20
    shylockhg  
       2019-06-03 18:55:37 +08:00
    还有 printf 也比 printk 耗时多了
    pymumu
        21
    pymumu  
       2019-06-03 18:58:47 +08:00 via iPhone
    gcc O2 优化了
    smdbh
        22
    smdbh  
       2019-06-03 21:15:21 +08:00 via iPhone
    弱弱的问下,用户态默认是独占 cpu,不被调度吗
    zwh2698
        23
    zwh2698  
       2019-06-03 23:32:43 +08:00 via Android
    不用状态切换
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2820 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:45 · PVG 16:45 · LAX 00:45 · JFK 03:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.