C++
switch
在特定情况下效率远低于 if
switch (*it) { case '\\': /* 处理转义 */ break; case '\b': case '\r': case '\n': case '\f': /* 报错 */ break; default: /* 正常添加一个字符 */ break; }
此时只有 5
个case
和一个 default
,测试数据解析的耗时约 70ms
。如果减去一个 case '\f'
可以降到 64ms
,只保留 case '\\`
和 default
则是 60ms
。
但是,一旦你再加上一个判断,像下面这样:
switch (*it) { case '\\': /* 处理转义 */ break; case '\b': case '\r': case '\n': case '\f': case '\t' /* 报错 */ break; default: /* 正常添加一个字符 */ break; }
这就导致耗时直接增加到 120ms
!!!! 这可能是因为分支数量较低时判断方式类似 if/else
,但是增加到一定量后内部实现变为查表甚至二分,而变化交界处的性能存在严重问题。
- MSVC , C++23 , Release 模型,多次测试