189 8069 5689

高并发中if-else、Switch结构的陷阱有哪些

这篇文章主要介绍高并发中if-else、Switch结构的陷阱有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

为林芝等地区用户提供了全套网页设计制作服务,及林芝网站建设行业解决方案。主营业务为成都网站设计、成都网站制作、林芝网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

Swich的坑,环境一变效率就差远了

由于Rust并没有Switch了,因此以下代码就暂用Go语言来演示了。我们先来看以下这段代码:

package main
 
import (
        "fmt"
        "math/rand"
 
        //"sync"
 
        "time"
)

 
func main() {
 
        now := time.Now().UnixNano()
 
        count := []int{0, 0, 0, 0, 0, 0}
 
        for i := 0; i < 100000; i++ {
 
                 random := rand.Intn(100)
 
                 switch random {
 
                 case 1:
 
                         count[1]++
 
                 case 2:
 
                         count[2]++
 
                 case 3:
 
                         count[3]++
 
                 case 4:
 
                         count[4]++
 
                 case 5:
 
                         count[5]++
 
                 default:
 
                         count[0]++
 
                 }
 
        }
 
 
 
        fmt.Println(time.Now().UnixNano() - now)
 
        fmt.Println(count)
 
 
 
}

它的运行结果如下:

[root@ecs-a4d3 hello_world]# time ./test1
2818084
[99507 86 108 106 96 97] 
real  0m0.004s
user 0m0.003s
sys   0m0.001s

我们再稍微把Random的范围由100改为5。

package main

import (
 
        "fmt"
 
        "math/rand"
 
 
 
        //"sync"
 
        "time"
 
)
 
 
 
func main() {
 
        now := time.Now().UnixNano()
 
        count := []int{0, 0, 0, 0, 0, 0}
 
 
 
        for i := 0; i < 100000; i++ {
 
                 random := rand.Intn(1000)
 
                 switch random {
 
                 case 1:
 
                         count[1]++
 
                 case 2:
 
                         count[2]++
 
                 case 3:
 
                         count[3]++
 
                 case 4:
 
                         count[4]++
 
                 case 5:
 
                         count[5]++
 
                 default:
 
                         count[0]++
 
                 }
 
        }
 
 
 
        fmt.Println(time.Now().UnixNano() - now)
 
        fmt.Println(count)
 
 
 
}

上述的代码运行结果如下:

[root@ecs-a4d3 hello_world]# time ./test1
 
4365712
 
[20184 20357 19922 19897 19640 0]
 
 
 
real  0m0.006s
 
user 0m0.004s
 
sys   0m0.002s

可以看到这两段程序的运行时间相差了30%多,这个结果真的是细思极恐,因为也就是实际代码执行逻辑完全没有任何变化 ,只是变量取值范围有所调整,就会使程序的运行效率大为不同,也就是说当系统遭遇到某些极端情况时,同样的程序所需要的运行时间却有天壤之别。

Rust的Else if也是一样的坑

当然我们说switch不好也就不是说else if就避免了这个问题,根据指令流水线的原理,elseif在处理分支时情况也一样,因此Rust也不太推荐else if的写法,以Rust为例如下:

use rand::Rng;
 
fn main() {
 
let mut rng = rand::thread_rng();
 
let mut arr = [0, 0, 0, 0, 0,0];
 
//println!("Integer: {}", arr[random]);
 
for i in 0..1000000 {
 
let mut random =rng.gen_range(0,5);
 
if random==0{
 
arr[0]=arr[0]+1;
 
}else if random==1{
 
arr[1]=arr[1]+1;
 
}else if random==2{
 
arr[2]=arr[2]+1;
 
}else if random==3{
 
arr[3]=arr[3]+1;
 
}else if random==4{
 
arr[4]=arr[4]+1;
 
}else{
 
arr[5]=arr[5]+1;
 
}
 
}
 
println!("{},{},{},{},{},{}", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]);
 
}

将随机数的取值范围调整一下

let mut random =rng.gen_range(0,100);

可以观察到这两段程序运行的时间也要相差近40%,这样的结果也深刻说明了一个问题,这个例子其实模拟的是一个极端状态,也就是某一个变量取值突然从0-100变成了0-5那么程序的运行效率可能就会有极大的改变,这个推论就是一旦系统运行在某一个极端状态,比如错误占比过高或者其它极端场景,那么正常情况下的压力测试结果也许就完全不能说明问题了。

以上是“高并发中if-else、Switch结构的陷阱有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!


网站名称:高并发中if-else、Switch结构的陷阱有哪些
链接分享:http://cdxtjz.cn/article/geigco.html

其他资讯