本帖最后由 Simon.Sun 于 2022-11-15 10:45 编辑
在使用活字格开发业务系统时,难免会遇到使用循环控制来重复执行用一个业务操作逻辑,这样相比于一个一个写命令的执行逻辑,循环控制可以减少很多重复的编码操作。但使用循环控制语句组织业务逻辑时,循环体内执行逻辑的执行时间对整个命令逻辑的性能影响会随着循环的次数的增加而放大。尤其是当存在循环嵌套的时候,循环的次数会指数级地增加。所以当我们来排查业务系统性能问题时,如果命令逻辑中存在循环控制,去优化循环次数或者优化单次循环的执行时间,就可以大幅地提高这个命令整体的执行效率。说了这么多,下面通过一个简单的例子来说明循环对命令执行效率的影响。
场景很简单,表格中有 1000 条数据,有 ID、文本、整数 3 个字段,需求是批量地将表中的整数字段全部加 1。这里通过三种方式实现: 方式 1:创建服务端命令,循环更新 1000 条数据; 方式 2:创建服务端命令,使用执行 SQL 命令来更新数据; 方式 3:创建服务端命令更新单行数据,前端循环调用这个服务端命令。
下面简单说明下这三种方式的实现方式: 方式 1 的服务端命令,就是在服务端循环调用数据表操作命令,根据 ID 更新对应的整数列,将整数列加 1,如下图所示:
方式 2 的服务端命令就是使用执行 SQL 命令,通过下面的 SQL 来批量将整数字段加 1:
方式 3 就是在前端调用服务端命令,该服务端命令将单独行的整数加 1,如下图所示:
现在我们分别执行一些,看下执行效率如何: [td]测试次数 | 方式 1 耗时(ms) | 方式 2 耗时(ms) | 方式 3 耗时(ms) | 1 | 377 | 54 | 2637 | 2 | 412 | 74 | 2710 | 3 | 537 | 82 | 2659 |
这里测试了三次,从测试结果来看,方式 2 的执行效率最高,方式 3 的执行效率最低。下面简单分析下原因: 方式 1 和 方式 2 对比,其都是在服务端命令中执行的,不同的是方式 1 在服务端中循环了 1000 次,方式 2 则只需要执行一次 SQL 命令,从这个结果可以看出,减少循环次数可以提高执行效率; 那方式 1 和方式 3 对比,其都执行了 1000 次,不同的是方式 1 的单次循环是在服务端执行的,方式 3 的单次循环需要从前端发起请求到后端,明显方式 3 的单次循环执行时间要高于方式 1,然后经过循环次数的放大,方式 3 的执行效率明显低于方式 1。
通过上述简单的例子,我们在实现包含了循环控制的业务逻辑时或者在排查命令执行性能时,我们首先要考虑一点,循环的次数能不能减少(降低执行命令的时间复杂度)。比如能不能将命令序列的 3 层循环改成 2 层循环,将 2 层循环改成 1 层循环,将一层循环改成执行有限次数。如果执行次数不能优化,我们需要再看能不能优化循环内单次执行命令的效率,假设单次执行能够优化 10 ms,那么 1000 次循环就可以优化 10s 钟。比如这个例子中的方式 3 到方式 1,就是通过优化单次命令的执行时间(都放到服务端执行,避免前端请求服务端网络请求的消耗),从而很大程度地提高了执行效率。 好了,到这里使用循环控制的注意事项就说完了,大家如果在命令的执行性能方面有好的使用心得,欢迎发帖补充哈。
|