测试显示while循环比for循环更快,是否应替换所有for循环为while循环?
Nginx+OpenResty中While循环比For循环快,是否需要全部替换?
测试背景与代码
我在Nginx + Lua(基于OpenResty、LuaJIT)环境中对不同循环的性能做了测试,测试代码如下:
local ngx_log = ngx.log local ngx_LOG_TYPE = ngx.STDERR local N=1e8 t0=os.clock() a = 0 while a < N do a = a + 1 end t1=os.clock()-t0 ngx_log(ngx_LOG_TYPE,"While Global " .. t1 .. " " .. math.floor(t1/t1*100+0.5)) t0=os.clock() local a = 0 while a < N do a = a + 1 end t2=os.clock()-t0 ngx_log(ngx_LOG_TYPE,"While Local " .. t2 .. " " .. math.floor(t1/t2*100+0.5)) t0=os.clock() b = 0 for i=1,N do b = b + 1 end t3=os.clock()-t0 ngx_log(ngx_LOG_TYPE,"For Global " .. t3 .. " " .. math.floor(t1/t3*100+0.5)) t0=os.clock() local b = 0 for i=1,N do b = b + 1 end t4=os.clock()-t0 ngx_log(ngx_LOG_TYPE,"For Local " .. t4 .. " " .. math.floor(t1/t4*100+0.5))
测试输出结果
[lua] test.lua:14: While Global 0.048999999999999 100, client: 127.0.0.1, server: localhost, request: "GET /test.lua HTTP/1.1", host: "localhost" [lua] test.lua:22: While Local 0.030000000000001 163, client: 127.0.0.1, server: localhost, request: "GET /test.lua HTTP/1.1", host: "localhost" [lua] test.lua:30: For Global 0.057000000000002 86, client: 127.0.0.1, server: localhost, request: "GET /test.lua HTTP/1.1", host: "localhost" [lua] test.lua:38: For Local 0.036000000000001 136, client: 127.0.0.1, server: localhost, request: "GET /test.lua HTTP/1.1", host: "localhost"
从结果能看到,所有循环执行速度都很快,但while循环确实比for循环略快,尤其是使用局部变量的情况下。
是否要全替换for循环为while?
结论是不需要盲目全替换,理由如下:
- 性能差距在实际业务中可忽略:测试是跑了1亿次循环才测出毫秒级差距,而实际业务代码里的循环次数通常远低于这个量级,这点性能提升对整体请求响应时间几乎没有影响。
- 代码可读性与维护性优先:for循环在处理固定次数的遍历场景时语义更清晰,比如遍历数组、固定次数迭代,别人看代码一眼就能明白循环意图;换成while循环需要额外维护计数器,反而增加代码复杂度,容易出错。
- LuaJIT的优化能力:LuaJIT对常见的for循环已经做了充分优化,在实际业务代码中,循环内部的逻辑(比如IO操作、复杂计算)才是性能瓶颈,而非循环本身的结构。
当然,如果你的代码里确实存在百万级以上的高频循环,且经过性能 profiling 确认循环结构是性能瓶颈,那可以针对性地替换成while循环;否则,优先保证代码的可读性和可维护性更重要。
内容的提问来源于stack exchange,提问作者C0nw0nk
相关产品推荐
相关产品推荐

