为什么同一段代码在 Linux 内核态比用户态执行的效率高? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Deardrops
V2EX    Linux

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

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

    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     Solana     2601 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 14:50 PVG 22:50 LAX 06:50 JFK 09:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86