V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
miniliuke
V2EX  ›  Go 编程语言

go 语言性能

  •  
  •   miniliuke · 2018-03-22 11:47:34 +08:00 via Android · 4608 次点击
    这是一个创建于 2423 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么我写了一个死循环,结果在 windows 下 cpu 利用率只有 7%......

    45 条回复    2018-03-23 13:05:21 +08:00
    miniliuke
        1
    miniliuke  
    OP
       2018-03-22 11:49:18 +08:00 via Android
    刚接触,不是写个 c 死循环 cpu 都接近 100 吗?
    lazyzml
        2
    lazyzml  
       2018-03-22 11:51:13 +08:00   ❤️ 1
    萌新想问一句 死循环能测性能吗
    KIDJourney
        3
    KIDJourney  
       2018-03-22 11:59:06 +08:00
    try this:

    ```
    package main

    import (
    "runtime"
    "sync"
    )

    func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    wg := sync.WaitGroup{}
    for i := 0; i < runtime.NumCPU(); i ++ {
    wg.Add(1)
    go func() {
    for {

    }
    wg.Done()
    }()
    }
    wg.Wait()
    }
    ```
    feverzsj
        5
    feverzsj  
       2018-03-22 12:03:47 +08:00
    go 性能和 java 差不多
    miniliuke
        6
    miniliuke  
    OP
       2018-03-22 12:05:51 +08:00 via Android
    @KIDJourney 这个是多线程吗?单线程怎么提高 cpu 利用率,我觉得 go 不应该这么低啊
    KIDJourney
        7
    KIDJourney  
       2018-03-22 12:08:57 +08:00
    @miniliuke 我这边用 golang 和 c 跑单进程的死循环,cpu 使用是一样的。
    miniliuke
        8
    miniliuke  
    OP
       2018-03-22 12:10:49 +08:00 via Android
    @KIDJourney 也很低还是都很高?我这边 c 死循环就非常卡顿了,go 只有 7
    miniliuke
        9
    miniliuke  
    OP
       2018-03-22 12:12:10 +08:00 via Android
    @KIDJourney 还有难道是 windows 的锅?
    KIDJourney
        10
    KIDJourney  
       2018-03-22 12:13:06 +08:00
    @miniliuke
    都很高。
    不清楚和系统有没有关系。
    miniliuke
        11
    miniliuke  
    OP
       2018-03-22 12:26:01 +08:00 via Android
    @KIDJourney 很难受感觉用了假的 go 语言
    miniliuke
        12
    miniliuke  
    OP
       2018-03-22 12:30:43 +08:00 via Android
    @KIDJourney 发现用 c 也一样,可能是系统问题吧:)
    fwee
        13
    fwee  
       2018-03-22 12:33:53 +08:00
    编译器会优化..你要上代码或汇编才知道
    choury
        14
    choury  
       2018-03-22 12:36:27 +08:00 via Android
    编译器发现你这是个没用的死循环,直接给优化没了……
    miniliuke
        15
    miniliuke  
    OP
       2018-03-22 12:38:12 +08:00 via Android
    @choury 但是我用 c 也一样 cpu 占用 7,为什么呀?
    SuperMild
        16
    SuperMild  
       2018-03-22 12:39:24 +08:00
    现在的编译器、操作系统、CPU 会做很多优化,很多时候不能看表面。

    另外,完成同一个任务,CPU 利用率低才是效率高。7%的利用率就完成了别人需要 100%利用率才能完成的任务,你应该高兴才对。
    miniliuke
        17
    miniliuke  
    OP
       2018-03-22 12:47:25 +08:00 via Android
    @SuperMild 死循环也谈不上优化吧......而且这种没有 io 瓶颈的计算还是 cpu 占用高点好吧......主要占用连 10 都不到......
    dobelee
        18
    dobelee  
       2018-03-22 12:53:30 +08:00 via Android
    死循环判断性能。。能不能再荒谬一点。
    miniliuke
        19
    miniliuke  
    OP
       2018-03-22 12:59:05 +08:00 via Android
    @dobelee 不是评判性能,只是看一下死循环能利用多少 cpu
    weizhen199
        20
    weizhen199  
       2018-03-22 13:05:03 +08:00
    你看下是吃了一个核还是总的 cpu
    miniliuke
        21
    miniliuke  
    OP
       2018-03-22 13:20:12 +08:00 via Android
    @weizhen199 我看了一下没有一个核超过 20
    iceheart
        22
    iceheart  
       2018-03-22 13:39:43 +08:00 via Android
    8 核 16 线程的 cpu 吧
    jccg90
        23
    jccg90  
       2018-03-22 13:44:20 +08:00
    什么都没有的空循环,编译器会给优化吧。写个算哈希值的挖矿算法的循环试试吧。
    xdeng
        24
    xdeng  
       2018-03-22 13:46:04 +08:00
    你这 CPU 是 6 核 12 线程的吧 ? 8700 ?
    LJ2010
        25
    LJ2010  
       2018-03-22 13:49:31 +08:00   ❤️ 1
    https://benchmarksgame.alioth.debian.org/ 个人认为测试的还是比较全面
    LJ2010
        26
    LJ2010  
       2018-03-22 13:52:58 +08:00
    前三位基本上 C,C++,Rust
    misaka19000
        27
    misaka19000  
       2018-03-22 13:55:01 +08:00
    你的死循环只会在一个核上执行,因为 Windows 的 CPU 监测是针对所有的 CPU,在多核情况下 Windows 单核跑满也不会导致 CPU 使用率 100%的
    miniliuke
        28
    miniliuke  
    OP
       2018-03-22 14:00:00 +08:00 via Android
    @iceheart 好像是的:)但是一个核都没跑满,感觉有点奇怪
    misaka19000
        29
    misaka19000  
       2018-03-22 14:02:25 +08:00
    我刚刚在 Mac 上面试了下死循环是能导致 100%的 CPU 使用率的

    https://imgur.com/fBkIjib
    https://imgur.com/O9CUCNV
    goofcc
        30
    goofcc  
       2018-03-22 14:28:43 +08:00
    简单点说,5 台 java 服务器,1 台 go 服务器搞定。
    KIDJourney
        31
    KIDJourney  
       2018-03-22 14:45:36 +08:00
    @misaka19000 对,我也是在 mac 上测试的,
    miniliuke
        32
    miniliuke  
    OP
       2018-03-22 14:53:21 +08:00 via Android
    @goofcc 不至于这么夸张吧
    rockyou12
        33
    rockyou12  
       2018-03-22 15:01:42 +08:00
    @miniliuke 至少内存上是这样,我遇到过同样功能内存差 20 倍
    miniliuke
        34
    miniliuke  
    OP
       2018-03-22 15:04:56 +08:00 via Android
    @rockyou12 的确 go 内存用的是真少,不涉及 io 的话,感觉性能与 c 相当(自我感觉)
    RubyJack
        35
    RubyJack  
       2018-03-22 15:19:39 +08:00
    大多数情况下,java 除非已经 jit 了,才可能和 go 差不多
    miniliuke
        36
    miniliuke  
    OP
       2018-03-22 15:25:07 +08:00 via Android
    @RubyJack 毕竟机器码,但是我看 benchmark 里有些算法 go 消耗的时间比 java 长,而且长不少,不知道为什么
    misaka19000
        37
    misaka19000  
       2018-03-22 15:25:29 +08:00
    任何一门语言都是能导致 CPU 100%的,事实上以下 Python 将导致 CPU 100%
    ```python
    while 1:
    i = 0
    ```
    因为没有任何 IO 操作的程序将会一直使用 CPU 而不阻塞。
    是否能够让 CPU100%不是判断一门语言是否高效的正确方法,判断一门语言是否高效可以使用以下两方面来判断:
    1. CPU 的使用是否高效
    2. 内存使用是否高效

    Go 语言因为没有虚拟机,所以同等数量的指令相较于 Java 和 Python 可以做更多的事情,同样是因为虚拟机的存在,所以 Java 在运行时要占用更多的内存。
    除此之外,对于网络 IO 密集型程序,Go 提供了协程这个解决方案,这也是 Go 语言性能优秀的一部分。对于目前很多的应用而言,其主要瓶颈在于 IO,Go 语言解决了这方面的问题。
    miniliuke
        38
    miniliuke  
    OP
       2018-03-22 16:02:57 +08:00 via Android
    @misaka19000 受教了,但是 python 理论上好像不能 100%,具体忘记了......其他语言理论上应该可以达到
    0x8C
        39
    0x8C  
       2018-03-22 16:25:15 +08:00
    你是想问为啥你的代码不能把 cpu 跑满吧?
    novacn
        40
    novacn  
       2018-03-22 18:13:42 +08:00
    顶 37, 语言性能的好坏是指同样软硬件资源下,对资源的使用效率, 假设 java 能单位时间处理 100 个请求,而 c 能处理 200, 可以说 c 更高效一点。 cpu 啥语言都能跑满的。
    miniliuke
        41
    miniliuke  
    OP
       2018-03-22 19:24:44 +08:00 via Android
    @0x8C 对啊,死循环应该能跑到,就算不到 100,但是个位数也太低了
    aminic
        42
    aminic  
       2018-03-22 20:56:14 +08:00 via Android
    想烧坏电脑请浇油点火💀
    wweir
        43
    wweir  
       2018-03-22 23:02:27 +08:00 via Android
    直接上代码,莫不是在死循环里面 Println 了吧?
    miniliuke
        44
    miniliuke  
    OP
       2018-03-23 12:02:01 +08:00 via Android
    @wweir 空的死循环
    notreami
        45
    notreami  
       2018-03-23 13:05:21 +08:00
    @goofcc 好厉害啊~牛皮吹的好厉害啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3498 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 04:35 · PVG 12:35 · LAX 20:35 · JFK 23:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.