为什么我写了一个死循环,结果在 windows 下 cpu 利用率只有 7%......
1
miniliuke OP 刚接触,不是写个 c 死循环 cpu 都接近 100 吗?
|
2
lazyzml 2018-03-22 11:51:13 +08:00 1
萌新想问一句 死循环能测性能吗
|
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() } ``` |
4
KIDJourney 2018-03-22 11:59:35 +08:00
|
5
feverzsj 2018-03-22 12:03:47 +08:00
go 性能和 java 差不多
|
6
miniliuke OP @KIDJourney 这个是多线程吗?单线程怎么提高 cpu 利用率,我觉得 go 不应该这么低啊
|
7
KIDJourney 2018-03-22 12:08:57 +08:00
@miniliuke 我这边用 golang 和 c 跑单进程的死循环,cpu 使用是一样的。
|
8
miniliuke OP @KIDJourney 也很低还是都很高?我这边 c 死循环就非常卡顿了,go 只有 7
|
9
miniliuke OP @KIDJourney 还有难道是 windows 的锅?
|
10
KIDJourney 2018-03-22 12:13:06 +08:00
|
11
miniliuke OP @KIDJourney 很难受感觉用了假的 go 语言
|
12
miniliuke OP @KIDJourney 发现用 c 也一样,可能是系统问题吧:)
|
13
fwee 2018-03-22 12:33:53 +08:00
编译器会优化..你要上代码或汇编才知道
|
14
choury 2018-03-22 12:36:27 +08:00 via Android
编译器发现你这是个没用的死循环,直接给优化没了……
|
16
SuperMild 2018-03-22 12:39:24 +08:00
现在的编译器、操作系统、CPU 会做很多优化,很多时候不能看表面。
另外,完成同一个任务,CPU 利用率低才是效率高。7%的利用率就完成了别人需要 100%利用率才能完成的任务,你应该高兴才对。 |
17
miniliuke OP @SuperMild 死循环也谈不上优化吧......而且这种没有 io 瓶颈的计算还是 cpu 占用高点好吧......主要占用连 10 都不到......
|
18
dobelee 2018-03-22 12:53:30 +08:00 via Android
死循环判断性能。。能不能再荒谬一点。
|
20
weizhen199 2018-03-22 13:05:03 +08:00
你看下是吃了一个核还是总的 cpu
|
21
miniliuke OP @weizhen199 我看了一下没有一个核超过 20
|
22
iceheart 2018-03-22 13:39:43 +08:00 via Android
8 核 16 线程的 cpu 吧
|
23
jccg90 2018-03-22 13:44:20 +08:00
什么都没有的空循环,编译器会给优化吧。写个算哈希值的挖矿算法的循环试试吧。
|
24
xdeng 2018-03-22 13:46:04 +08:00
你这 CPU 是 6 核 12 线程的吧 ? 8700 ?
|
25
LJ2010 2018-03-22 13:49:31 +08:00 1
https://benchmarksgame.alioth.debian.org/ 个人认为测试的还是比较全面
|
26
LJ2010 2018-03-22 13:52:58 +08:00
前三位基本上 C,C++,Rust
|
27
misaka19000 2018-03-22 13:55:01 +08:00
你的死循环只会在一个核上执行,因为 Windows 的 CPU 监测是针对所有的 CPU,在多核情况下 Windows 单核跑满也不会导致 CPU 使用率 100%的
|
29
misaka19000 2018-03-22 14:02:25 +08:00
|
30
goofcc 2018-03-22 14:28:43 +08:00
简单点说,5 台 java 服务器,1 台 go 服务器搞定。
|
31
KIDJourney 2018-03-22 14:45:36 +08:00
@misaka19000 对,我也是在 mac 上测试的,
|
34
miniliuke OP @rockyou12 的确 go 内存用的是真少,不涉及 io 的话,感觉性能与 c 相当(自我感觉)
|
35
RubyJack 2018-03-22 15:19:39 +08:00
大多数情况下,java 除非已经 jit 了,才可能和 go 差不多
|
36
miniliuke OP @RubyJack 毕竟机器码,但是我看 benchmark 里有些算法 go 消耗的时间比 java 长,而且长不少,不知道为什么
|
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 语言解决了这方面的问题。 |
38
miniliuke OP @misaka19000 受教了,但是 python 理论上好像不能 100%,具体忘记了......其他语言理论上应该可以达到
|
39
0x8C 2018-03-22 16:25:15 +08:00
你是想问为啥你的代码不能把 cpu 跑满吧?
|
40
novacn 2018-03-22 18:13:42 +08:00
顶 37, 语言性能的好坏是指同样软硬件资源下,对资源的使用效率, 假设 java 能单位时间处理 100 个请求,而 c 能处理 200, 可以说 c 更高效一点。 cpu 啥语言都能跑满的。
|
42
aminic 2018-03-22 20:56:14 +08:00 via Android
想烧坏电脑请浇油点火💀
|
43
wweir 2018-03-22 23:02:27 +08:00 via Android
直接上代码,莫不是在死循环里面 Println 了吧?
|