switch和if-else性能对比

switch 与 if-else 性能对比:V8 引擎下 10 万次循环实测 本文通过10万次循环基准测试,对比了JavaScript中switch语句与if-else在V8引擎下的性能差异。测试结果显示,随着分支数量增加,switch语句凭借跳转表优化展现出显著优势,尤其在20个分支时比if-else快约125%。文章还深入分析了V8引擎的优化机制,并提供了实际开发中的性能优化建议。 阅读详情

switch和if-else,我想写过代码的人都不会对这两个陌生,除非真的是新手中的新手。
这里就对这两个平时我们经常用的,做一个详细的性能分析

条件判断语句是程序的重要组成部分,也是系统业务逻辑的控制手段。重要程度和使用频率更是首屈一指,那么在日常编码中,我们怎么在switch和if-else中做抉择呢?

实验开始

switch VS if

从考虑性能上考虑的话,尽量使用switch,因为这个性能比if高,但具体会高多少呢。

借助 Oracle 官方提供的 JMH(Java Microbenchmark Harness,JAVA 微基准测试套件)框架来进行测试,首先引入 JMH 框架,在 pom.xml 文件中添加如下配置:

<dependency>
   <groupId>org.openjdk.jmh</groupId>
   <artifactId>jmh-core</artifactId>
   <version>1.23</version>
</dependency>

然后编写测试代码,实验中添加了5个条件判断分支,具体实现代码如下:

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
 
import java.util.concurrent.TimeUnit;
 
@BenchmarkMode(Mode.AverageTime) // 测试完成时间
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 2, time = 1, timeUnit = TimeUnit.SECONDS) // 预热 2 轮,每次 1s
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) // 测试 5 轮,每次 3s
@Fork(1) // fork 1 个线程
@State(Scope.Thread) // 每个测试线程一个实例
public class SwitchOptimizeTest {
 
    static Integer _NUM = 9;
 
    public static void main(String[] args) throws RunnerException {
        // 启动基准测试
        Options opt = new OptionsBuilder()
                .include(SwitchOptimizeTest.class.getSimpleName()) // 要导入的测试类
                .output("/Users/admin/Desktop/jmh-switch.log") // 输出测试结果的文件
                .build();
        new Runner(opt).run(); // 执行测试
    }
    @Benchmark
    public void switchTest() {
        int num1;
        switch (_NUM) {
            case 1:
                num1 = 1;
                break;
            case 3:
                num1 = 3;
                break;
            case 5:
                num1 = 5;
                break;
            case 7:
                num1 = 7;
                break;
            case 9:
                num1 = 9;
                break;
            default:
                num1 = -1;
                break;
        }
    }
    @Benchmark
    public void ifTest() {
        int num1;
        if (_NUM == 1) {
            num1 = 1;
        } else if (_NUM == 3) {
            num1 = 3;
        } else if (_NUM == 5) {
            num1 = 5;
        } else if (_NUM == 7) {
            num1 = 7;
        } else if (_NUM == 9) {
            num1 = 9;
        } else {
            num1 = -1;
        }
    }
}

实验的测试结果:
在这里插入图片描述
从以上结果可以看出(Score 列),switch 的平均执行完成时间比 if 的平均执行完成时间快了约 2.33 倍 (2倍多的效率了哇,这已经说明很多了)。

性能分析

为什么 switch 的性能会比 if 的性能高这么多?

这需要从他们字节码说起,我们把他们的代码使用 javac 生成字节码如下所示:

public class com.example.optimize.SwitchOptimize {
  static java.lang.Integer _NUM;
 
  public com.example.optimize.SwitchOptimize();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
 
  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #7                  // Method switchTest:()V
       3: invokestatic  #12                 // Method ifTest:()V
       6: return
 
  public static void switchTest();
    Code:
       0: getstatic     #15                 // Field _NUM:Ljava/lang/Integer;
       3: invokevirtual #19                 // Method java/lang/Integer.intValue:()I
       6: tableswitch   { // 1 to 9
                     1: 56
                     2: 83
                     3: 61
                     4: 83
                     5: 66
                     6: 83
                     7: 71
                     8: 83
                     9: 77
               default: 83
          }
      56: iconst_1
      57: istore_0
      58: goto          85
      61: iconst_3
      62: istore_0
      63: goto          85
      66: iconst_5
      67: istore_0
      68: goto          85
      71: bipush        7
      73: istore_0
      74: goto          85
      77: bipush        9
      79: istore_0
      80: goto          85
      83: iconst_m1
      84: istore_0
      85: return
 
  public static void ifTest();
    Code:
       0: getstatic     #15                 // Field _NUM:Ljava/lang/Integer;
       3: invokevirtual #19                 // Method java/lang/Integer.intValue:()I
       6: iconst_1
       7: if_icmpne     15
      10: iconst_1
      11: istore_0
      12: goto          81
      15: getstatic     #15                 // Field _NUM:Ljava/lang/Integer;
      18: invokevirtual #19                 // Method java/lang/Integer.intValue:()I
      21: iconst_3
      22: if_icmpne     30
      25: iconst_3
      26: istore_0
      27: goto          81
      30: getstatic     #15                 // Field _NUM:Ljava/lang/Integer;
      33: invokevirtual #19                 // Method java/lang/Integer.intValue:()I
      36: iconst_5
      37: if_icmpne     45
      40: iconst_5
      41: istore_0
      42: goto          81
      45: getstatic     #15                 // Field _NUM:Ljava/lang/Integer;
      48: invokevirtual #19                 // Method java/lang/Integer.intValue:()I
      51: bipush        7
      53: if_icmpne     62
      56: bipush        7
      58: istore_0
      59: goto          81
      62: getstatic     #15                 // Field _NUM:Ljava/lang/Integer;
      65: invokevirtual #19                 // Method java/lang/Integer.intValue:()I
      68: bipush        9
      70: if_icmpne     79
      73: bipush        9
      75: istore_0
      76: goto          81
      79: iconst_m1
      80: istore_0
      81: return
 
  static {};
    Code:
       0: iconst_1
       1: invokestatic  #25                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       4: putstatic     #15                 // Field _NUM:Ljava/lang/Integer;
       7: return
}

这些字节码中最重要的信息是“getstatic #15”,这段代码表示取出“_NUM”变量和条件进行判断。

从上面的字节码可以看出,在 switch 中只取出了一次变量和条件进行比较,而 if 中每次都会取出变量和条件进行比较,因此 if 的效率就会比 switch 慢很多。

提升测试量

前面的实验中才使用了 5 个分支条件来测试了 if 和 switch 的性能,那么我将实验中用分支的判断条件提升 3 倍(15 个)再来做个测试,看看测试的结果会是什么样的呢?

增加至 15 个分支判断的实现代码如下:

package com.example.optimize;
 
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
 
import java.util.concurrent.TimeUnit;
 
@BenchmarkMode(Mode.AverageTime) // 测试完成时间
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 2, time = 1, timeUnit = TimeUnit.SECONDS) // 预热 2 轮,每次 1s
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) // 测试 5 轮,每次 3s
@Fork(1) // fork 1 个线程
@State(Scope.Thread) // 每个测试线程一个实例
public class SwitchOptimizeTest {
 
    static Integer _NUM = 1;
 
    public static void main(String[] args) throws RunnerException {
        // 启动基准测试
        Options opt = new OptionsBuilder()
                .include(SwitchOptimizeTest.class.getSimpleName()) // 要导入的测试类
                .output("/Users/admin/Desktop/jmh-switch.log") // 输出测试结果的文件
                .build();
        new Runner(opt).run(); // 执行测试
    }
 
    @Benchmark
    public void switchTest() {
        int num1;
        switch (_NUM) {
            case 1:
                num1 = 1;
                break;
            case 2:
                num1 = 2;
                break;
            case 3:
                num1 = 3;
                break;
            case 4:
                num1 = 4;
                break;
            case 5:
                num1 = 5;
                break;
            case 6:
                num1 = 6;
                break;
            case 7:
                num1 = 7;
                break;
            case 8:
                num1 = 8;
                break;
            case 9:
                num1 = 9;
                break;
            case 10:
                num1 = 10;
                break;
            case 11:
                num1 = 11;
                break;
            case 12:
                num1 = 12;
                break;
            case 13:
                num1 = 13;
                break;
            case 14:
                num1 = 14;
                break;
            case 15:
                num1 = 15;
                break;
            default:
                num1 = -1;
                break;
        }
    }
 
    @Benchmark
    public void ifTest() {
        int num1;
        if (_NUM == 1) {
            num1 = 1;
        } else if (_NUM == 2) {
            num1 = 2;
        } else if (_NUM == 3) {
            num1 = 3;
        } else if (_NUM == 4) {
            num1 = 4;
        } else if (_NUM == 5) {
            num1 = 5;
        } else if (_NUM == 6) {
            num1 = 6;
        } else if (_NUM == 7) {
            num1 = 7;
        } else if (_NUM == 8) {
            num1 = 8;
        } else if (_NUM == 9) {
            num1 = 9;
        } else if (_NUM == 10) {
            num1 = 10;
        } else if (_NUM == 11) {
            num1 = 11;
        } else if (_NUM == 12) {
            num1 = 12;
        } else if (_NUM == 13) {
            num1 = 13;
        } else if (_NUM == 14) {
            num1 = 14;
        } else if (_NUM == 15) {
            num1 = 15;
        } else {
            num1 = -1;
        }
    }
}

在这里插入图片描述

从 Score 的值可以看出,当分支判断增加至 15 个,switch 的性能比 if 的性能高出了约 3.7 倍,而之前有 5 个分支判断时的测试结果为,switch 的性能比 if 的性能高出了约 2.3 倍,也就是说分支的判断条件越多,switch 性能高的特性体现的就越明显。

switch的秘密

对于switch来说,它的最终生成的字节码会有两种形态,一种是 tableswitch,另一种是 lookupswitch,决定最终生成的代码使用那种形态取决于 switch 的判断添加是否紧凑,例如到 case 是 1…2…3…4 这种依次递增的判断条件时,使用的是 tableswitch,而像 case 是 1…33…55…22 这种非紧凑型的判断条件时则会使用 lookupswitch,实验代码如下:


public class SwitchOptimize {
    static Integer _NUM = 1;
    public static void main(String[] args) {
        tableSwitchTest();
        lookupSwitchTest();
    }
    public static void tableSwitchTest() {
        int num1;
        switch (_NUM) {
            case 1:
                num1 = 1;
                break;
            case 2:
                num1 = 2;
                break;
            case 3:
                num1 = 3;
                break;
            case 4:
                num1 = 4;
                break;
            case 5:
                num1 = 5;
                break;
            case 6:
                num1 = 6;
                break;
            case 7:
                num1 = 7;
                break;
            case 8:
                num1 = 8;
                break;
            case 9:
                num1 = 9;
                break;
            default:
                num1 = -1;
                break;
        }
    }
    public static void lookupSwitchTest() {
        int num1;
        switch (_NUM) {
            case 1:
                num1 = 1;
                break;
            case 11:
                num1 = 2;
                break;
            case 3:
                num1 = 3;
                break;
            case 4:
                num1 = 4;
                break;
            case 19:
                num1 = 5;
                break;
            case 6:
                num1 = 6;
                break;
            case 33:
                num1 = 7;
                break;
            case 8:
                num1 = 8;
                break;
            case 999:
                num1 = 9;
                break;
            default:
                num1 = -1;
                break;
        }
    }
}

对应的字节码如下:

public class com.example.optimize.SwitchOptimize {
  static java.lang.Integer _NUM;
 
  public com.example.optimize.SwitchOptimize();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
 
  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #7                  // Method tableSwitchTest:()V
       3: invokestatic  #12                 // Method lookupSwitchTest:()V
       6: return
 
  public static void tableSwitchTest();
    Code:
       0: getstatic     #15                 // Field _NUM:Ljava/lang/Integer;
       3: invokevirtual #19                 // Method java/lang/Integer.intValue:()I
       6: tableswitch   { // 1 to 9
                     1: 56
                     2: 61
                     3: 66
                     4: 71
                     5: 76
                     6: 81
                     7: 87
                     8: 93
                     9: 99
               default: 105
          }
      56: iconst_1
      57: istore_0
      58: goto          107
      61: iconst_2
      62: istore_0
      63: goto          107
      66: iconst_3
      67: istore_0
      68: goto          107
      71: iconst_4
      72: istore_0
      73: goto          107
      76: iconst_5
      77: istore_0
      78: goto          107
      81: bipush        6
      83: istore_0
      84: goto          107
      87: bipush        7
      89: istore_0
      90: goto          107
      93: bipush        8
      95: istore_0
      96: goto          107
      99: bipush        9
     101: istore_0
     102: goto          107
     105: iconst_m1
     106: istore_0
     107: return
 
  public static void lookupSwitchTest();
    Code:
       0: getstatic     #15                 // Field _NUM:Ljava/lang/Integer;
       3: invokevirtual #19                 // Method java/lang/Integer.intValue:()I
       6: lookupswitch  { // 9
                     1: 88
                     3: 98
                     4: 103
                     6: 113
                     8: 125
                    11: 93
                    19: 108
                    33: 119
                   999: 131
               default: 137
          }
      88: iconst_1
      89: istore_0
      90: goto          139
      93: iconst_2
      94: istore_0
      95: goto          139
      98: iconst_3
      99: istore_0
     100: goto          139
     103: iconst_4
     104: istore_0
     105: goto          139
     108: iconst_5
     109: istore_0
     110: goto          139
     113: bipush        6
     115: istore_0
     116: goto          139
     119: bipush        7
     121: istore_0
     122: goto          139
     125: bipush        8
     127: istore_0
     128: goto          139
     131: bipush        9
     133: istore_0
     134: goto          139
     137: iconst_m1
     138: istore_0
     139: return
 
  static {};
    Code:
       0: iconst_1
       1: invokestatic  #25                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       4: putstatic     #15                 // Field _NUM:Ljava/lang/Integer;
       7: return
}

从上面的字节码可以看出tableSwitchTest使用的是tableswitch,而lookupSwitchTest则是使用的lookupswitch。

tableswitch VS lookupSwitchTest

当执行一次 tableswitch 时,堆栈顶部的 int 值直接用作表中的索引,以便抓取跳转目标并立即执行跳转。也就是说 tableswitch 的存储结构类似于数组,是直接用索引获取元素的,所以整个查询的时间复杂度是 O(1),这也意味着它的搜索速度非常快。

而执行 lookupswitch 时,会逐个进行分支比较或者使用二分法进行查询,因此查询时间复杂度是 O(log n),所以使用 lookupswitch 会比 tableswitch 慢。

接下来我们使用实际的代码测试一下,他们两个之间的性能,测试代码如下:

package com.example.optimize;
 
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
 
import java.util.concurrent.TimeUnit;
 
@BenchmarkMode(Mode.AverageTime) // 测试完成时间
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 2, time = 1, timeUnit = TimeUnit.SECONDS) // 预热 2 轮,每次 1s
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) // 测试 5 轮,每次 3s
@Fork(1) // fork 1 个线程
@State(Scope.Thread) // 每个测试线程一个实例
public class SwitchOptimizeTest {
 
    static Integer _NUM = -1;
 
    public static void main(String[] args) throws RunnerException {
        // 启动基准测试
        Options opt = new OptionsBuilder()
                .include(SwitchOptimizeTest.class.getSimpleName()) // 要导入的测试类
                .build();
        new Runner(opt).run(); // 执行测试
    }
 
    @Benchmark
    public void tableSwitchTest() {
        int num1;
        switch (_NUM) {
            case 1:
                num1 = 1;
                break;
            case 2:
                num1 = 2;
                break;
            case 3:
                num1 = 3;
                break;
            case 4:
                num1 = 4;
                break;
            case 5:
                num1 = 5;
                break;
            case 6:
                num1 = 6;
                break;
            case 7:
                num1 = 7;
                break;
            case 8:
                num1 = 8;
                break;
            case 9:
                num1 = 9;
                break;
            default:
                num1 = -1;
                break;
        }
    }
 
    @Benchmark
    public void lookupSwitchTest() {
        int num1;
        switch (_NUM) {
            case 1:
                num1 = 1;
                break;
            case 11:
                num1 = 2;
                break;
            case 3:
                num1 = 3;
                break;
            case 4:
                num1 = 4;
                break;
            case 19:
                num1 = 5;
                break;
            case 6:
                num1 = 6;
                break;
            case 33:
                num1 = 7;
                break;
            case 8:
                num1 = 8;
                break;
            case 999:
                num1 = 9;
                break;
            default:
                num1 = -1;
                break;
        }
    }
}

测试结果:
在这里插入图片描述

可以看出分支判断为9时,tableswitch 的性能比 lookupwitch 的性能快了约 1.3 倍。但即使这样 lookupwitch 依然比 if 查询性能要高很多。

总结

switch 的判断条件是 5 个时,性能比 if 高出了约 2.3 倍,而当判断条件的数量越多时,他们的性能相差就越大。而 switch 在编译为字节码时,会根据 switch 的判断条件是否紧凑生成两种代码:tableswitch(紧凑时生成)和 lookupswitch(非紧凑时生成),其中 tableswitch 是采用类似于数组的存储结构,直接根据索引查询元素;而 lookupswitch 则需要逐个查询或者使用二分法查询,因此 tableswitch 的性能会比 lookupswitch 的性能高,但无论如何 switch 的性能都比 if 的性能要高。

Windows系统中 Xmanager 6 企业版下载安装激活教程 Xmanager 6 企业版安装激活教程 1.Xmanager 6 下载网址:https://yunpan.360.cn/surl_yrJrWq3GmjN 2. 双击 Xmanager-6.0.0169r 安装 3. 点击运行按钮 4. 点击下一步 5. 选择我接受许可证协议中的条款(A), 点击下一步。 6. 输入用户名:byg,公司名称:microsoft,序... 阅读详情

相关推荐

c语言国际象棋(easyx图形库)

c语言实现的国际象棋,先放源码,有空再更 所有图形资源均来源于网络,侵删 #include <graphics.h> #include<stdio.h> #include<conio.h> #include<math.h> #include<stdlib.h> #include <time.h> #define HEIGHT 800 #define WIDTH 1100 #define SIZE 100 #define true.

Betelgeuse13的博客 1914

if...else语句和switch语句的区别

if...else语句和switch语句都可以根据不同的情况检验条件,并作出相应的判断。那么if...else语句和switch语句有什么区别呢?下面从两者的语法和效率方面进行比较。提示以下是本篇文章正文内容,下面案例可供参考。............

xuyizhuo999的博客 7320

Chatbox使用指南

Chatbox使用指南

weixin_65289420的博客 2万+

分支语句和循环语句,为什么switch效率比if高?

目录 分支语句 switch与if..else效率分析 循环语句 分支语句 1、if语句分析 if语句用于根据条件选择执行语句 else不能独立存在且总是与它最近的if相匹配 else语句后可以连接其它if语句 if语句中零值比较的注意点 - bo...

洋葱汪的博客 1965

MTK-AWB 小结 (二)

调试总结:可以将offset 对应的ratio加大,保留更多的喜好色(偏色),影响WF statistic gain,从而影响最终的awb gain。这一部分前期CCT校准的时候就会算出一组默认值,当然这个offset offse 值用于优化T,S,wf 光下的偏色喜好度. offset。后面遇到 A H Shad 光收白或者偏色,还可以优化 A 的offset ,H offset,shad offset.new offset 计算过程(Day locus offset 和M/G offset )

qq_46056347的博客 1167

STM32F103+LAN9252实战:从站代码迁移中的5个硬件坑与解决方案

本文分享了将EtherCAT从站代码从STM32F767迁移至STM32F103平台时,搭配LAN9252遇到的五个典型硬件问题及解决方案。核心挑战包括时钟源不匹配、FSMC时序配置、中断映射错误、片选资源不足以及Flash烧录异常。文章通过实战经验,强调了硬件差异对代码迁移的关键影响,并提供了具体的调试思路与配置方法。

p5l2m9n4o6q的博客 697

Switch和if else哪个执行效率高?如何去选择?

好处就是,无论情况是多少,对执行效率没有影响,但是if else就不一样了,想要更加详细的探讨这个问题,我们要了解现代计算机处理器是采用流水线来获取高性能,采用了分支预测的方法,针对if else语句不是执行到了才被加载到处理器,而是处理器会提前将指令加载到流水线,如果条件成立则继续执行,否则,就会受到处罚,代价就是将已经加载处理的指令和结果丢弃掉,所以这是非常消耗性能的。那么既然switch那么好,能否替代if else呢?从执行效率来看,switch的执行效率更高。

m0_68049717的博客 3350

轻量级替代方案:用AIFlowy + Ollama在本地快速搭建一个可用的AI智能体平台

本文介绍了如何使用AIFlowy和Ollama在本地快速搭建轻量级AI智能体平台,涵盖从环境准备到智能体集成的全流程。通过简化部署步骤和优化性能,15分钟内即可完成搭建,适用于原型验证和小团队协作,显著提升开发效率。

weixin_29207533的博客 219

【汇编 C】switch为什么高效率?分支语句if else与switch

本文章使用到的工具是vs2010,建议使用VC++6,操作都一样。什么是分支语句?分支语句即进行一个选择,如果出现情况A则进行相应的操作;如果出现情况B则进行相应的操作,等等。if else分支语句我们也知道if是如果的意思,那么可以根据意思理解,比如:if(love == true) // 如果love是真不是假printf("这是真爱。\n");// 那么就输出这是真爱。

qq_52572621的博客 2099

Python爬虫实战:利用Selenium与反反爬技术高效爬取企查查工商信息

本文将详细介绍如何使用Python最新爬虫技术(包括Selenium、Playwright、智能代理池等)爬取企查查工商信息数据。文章包含完整的代码实现、反反爬策略、数据解析与存储方案,以及法律合规性讨论,共计约8000字。企查查作为国内领先的企业信息查询平台,收录了超过2亿家企业的工商信息、司法信息、知识产权等数据。这些数据对于市场分析、商业决策等具有重要价值。法律边界提示禁止大规模爬取导致服务器过载不得绕过付费接口获取数据数据使用需遵守《个人信息保护法》商业用途需获得授权。

2201_76125261的博客 2236

回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测

回归预测 | MATLAB实现基于贝叶斯线性回归(Bayesian Regression)的多变量输入回归预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 2199

c语言 switch case 太多优化/重构[二]

c语言 switch case 太多优化/重构[二]1. 背景 - 某该函数switch case 复杂度太高 ,函数太长 pclint不过2. 解决 - 建表,查表处理3. witch case 原理/代码优化 重构参考: 1. 背景 - 某该函数switch case 复杂度太高 ,函数太长 pclint不过 CHAR * AB_FUN_XXXX(IN ULONG ulResult) { UINT uiRcID; switch (ulResult) { case ERROR_SUCCESS:

哈尼的博客 6136

基于逆向工程的中国裁判文书网爬虫技术深度解析

本文详细介绍了中国裁判文书网爬虫的开发过程,涵盖了从基础爬取到高级功能的完整解决方案。逆向工程分析:理解网站的反爬机制和加密逻辑浏览器自动化:使用Playwright模拟真实用户行为参数加密:通过JavaScript执行环境生成加密参数智能调度:控制请求频率,避免被检测错误处理:完善的异常处理和重试机制。

2201_76125261的博客 2145

SWITCH vs IF-ELSE:性能对比与优化选择

对于需要长期运行的性能测试,平台的一键部署功能也很实用。它的在线编辑器用起来很顺手,还能直接运行代码看结果,特别适合做这种小实验。测试分为三个场景:只有3个分支的简单情况、7个分支的中等情况,以及15个分支的复杂情况。最近我专门做了个实验,用实际数据来对比这两种结构的效率,结果还挺有意思的。不过也要记住,代码的可读性和可维护性同样重要,不能一味追求性能而写出难以理解的代码。需要注意的是,现代JVM的即时编译器(JIT)会优化热点代码,长期运行的代码性能差异可能会缩小。最有趣的是在15个分支的测试中,

ObsidianRaven13的博客 611

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

为什么switch case比if else快?性能对比实测

最近在优化前端代码时,发现团队里有些同事特别喜欢用if else语句,而忽略了switch case这个更高效的选择。出于好奇,我决定做个性能对比测试,看看在JavaScript中这两种条件语句到底有多大差别。上可以直接运行这类性能测试代码,它的浏览器环境很干净,不会受插件干扰。最棒的是测试完可以直接部署成可分享的demo,同事点开链接就能看到完整结果。而if else需要逐个条件判断,平均时间复杂度是O(n),在最坏情况下要检查所有条件。为了公平对比,我设计了一个包含10种不同条件的测试场景。

ObsidianRaven13的博客 374

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

性能对比:CC-SWITCH比if-else快多少?实测数据说话

这个平台的核心目标是量化比较if-else和switch的性能差异。我决定采用WebAssembly来确保测试的准确性,避免JavaScript引擎优化带来的干扰。平台会自动生成不同分支数量的测试用例(5-50个),然后分别用if-else和switch实现相同的逻辑进行对比。每个分支包含简单的数值比较操作,确保测试的公平性。这个测试平台最棒的地方是,它不仅能给出性能数据,还能根据你的具体使用场景给出优化建议。比如如果你的条件判断是在循环内部频繁执行的,switch通常是更好的选择。

SilverfoxOwl19的博客 612

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【JAVA】控制流语句:if - else与switch性能对比(6)

在Java中,控制流语句用于控制程序的执行流程。常见的控制流语句包括条件语句(if - else)和选择语句(switch)。

Vinfol的博客 1403

Java性能优化-switch-case和if-else速度性能对比,到底谁快?

场景Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化:Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化_java热点函数参考以上性能测试工具的使用。下面针对Java中对switch-case和if...

weixin_35695434的博客 282

C语言 switch-case 与 if-else 性能对比:基于ARM Cortex-M3的10万次循环测试

本文基于ARM Cortex-M3架构,通过10万次循环测试对比了C语言中switch-case与if-else的性能差异。测试结果显示,随着分支数量增加,switch-case在性能上展现出显著优势,最高可达59%的速度提升。文章还提供了针对不同分支数量的选型建议、编译器优化技巧以及实际工程中的性能陷阱规避方法,为嵌入式开发人员提供了实用的优化指南。

weixin_33951761的博客 696

基础篇6:Java中switch语句的深入解析(与if+else if的性能对比)

  本文对分支结构switch应用进行了相应的测试,还对switch和if进行了相互重写,测试区别,给你一个不一样的switch理解。   switch分支结构的基础使用。   语法结构:switch(expr1)中,expr1是一个整数表达式, 整数表达式可以是int基本类型或Integer包装类型,byte,short,char都可以隐含转换为int,所以都可以,在jdk1.7后String也可以。switch 语句有至少一个 case 代码块和一个可选的 default 代码块。 switch(变.

liu___peng的博客 478

Java小白到底该如何使用switch和if ... else if?

Java程序员每天都在用 这个问题如果是一般的程序员还真不知道为啥,只知道别人都是这样写的,所以跟着这样写了,很少有人会深入地去思考这个问题,你能有这个疑问,说明你有一颗求真的心(我当年也想过????)。 这个问题对编程没有一定功底,是答不出个所以然的。我认为主要可以从编码习惯和程序性能上去思考。 编码习惯 我首先来说一下编码习惯,其它的不说,单从代码行数来看的话,实现相同的逻辑,switch比if...else if占用的行数是要多一些的,请看下面的示例代码: switch版 public class

Java后浪 894

java 枚举 性能_Java:枚举与if-then-else的性能

是的,因为一般来说,switch语句的工作速度比if / else链的速度要快.虽然生成的字节码并不总是确定性能比较的来源,但您可以检查它是否有更好的想法.例如这个代码:class A {enum N { ONE,TWO,THREE }void testSwitch( N e ) {switch( e ) {case ONE : x(); break;case TWO : x(); break;c...

weixin_28862557的博客 376

PHP Switch语句详解

在PHP编程中,

m0_74825699的博客 1440

Java Switch 和 If else 使用效率对比和分析

前言 在我们实际开发中,会经常用到逻辑走向的判断语法,最熟悉的逻辑判断莫过于switch和if else它们俩了,但是它们之间究竟哪个更优呢?我们来一起做个试验吧!其实这一篇我并不想这么啰嗦,本着写作负责任的态度,我还是按照惯例写前言或导语,其实我很想说:不啰嗦,直接上机进行测试纳诺耗时吧!!! 一、if else long t1 = System.nanoTime(); Str

csdn_aiyang的博客 2万+

java if emun_Java:Enums与if-then-else的表现

是的,确实如此,因为通常来说,switch语句比if / else链更快。虽然生成的字节码并不总是性能比较的明确来源,但您可以检查它以获得更好的想法。例如这段代码:class A {enum N { ONE, TWO, THREE }void testSwitch( N e ) {switch( e ) {case ONE : x(); break;case TWO : x(); break;ca...

weixin_39711348的博客 95
上一篇: HBase记录(一)
下一篇: GPU计算(一)
亦心ll
博客等级 码龄7年 10粉丝 12原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值