Skip to content

Commit b72f696

Browse files
authored
Update tutorial03_answer.md
1 parent 2d71967 commit b72f696

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

tutorial03_answer/tutorial03_answer.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
221221

222222
这是本教程第一次的开放式问题,没有标准答案。以下列出一些我想到的。
223223

224-
1. 如果整个字符串都没有转义符,我们不就是把字符复制了两次?第一次是从 `json``stack`,第二次是从 `stack``v->u.s.s`。我们可以在 `json` 扫瞄 `'\0'``'\"'``'\\'` 3 个字符( `ch < 0x20` 还是要检查),直至它们其中一个出现,才开始用现在的解析方法。这样做的话,前半没转义的部分可以只复制一次。缺点是,代码变得复杂一些,我们也不能使用 `lept_set_string()`
225-
2. 对于扫瞄没转义部分,我们可考虑用 SIMD 加速,如 [RapidJSON 代码剖析(二):使用 SSE4.2 优化字符串扫描](https://zhuanlan.zhihu.com/p/20037058) 的做法。这类底层优化的缺点是不跨平台,需要设置编译选项等。
224+
1. 如果整个字符串都没有转义符,我们不就是把字符复制了两次?第一次是从 `json``stack`,第二次是从 `stack``v->u.s.s`。我们可以在 `json` 扫描 `'\0'``'\"'``'\\'` 3 个字符( `ch < 0x20` 还是要检查),直至它们其中一个出现,才开始用现在的解析方法。这样做的话,前半没转义的部分可以只复制一次。缺点是,代码变得复杂一些,我们也不能使用 `lept_set_string()`
225+
2. 对于扫描没转义部分,我们可考虑用 SIMD 加速,如 [RapidJSON 代码剖析(二):使用 SSE4.2 优化字符串扫描](https://zhuanlan.zhihu.com/p/20037058) 的做法。这类底层优化的缺点是不跨平台,需要设置编译选项等。
226226
3. 在 gcc/clang 上使用 `__builtin_expect()` 指令来处理低概率事件,例如需要对每个字符做 `LEPT_PARSE_INVALID_STRING_CHAR` 检测,我们可以假设出现不合法字符是低概率事件,然后用这个指令告之编译器,那么编译器可能可生成较快的代码。然而,这类做法明显是不跨编译器,甚至是某个版本后的 gcc 才支持。
227227

228228
## 5. 总结

0 commit comments

Comments
 (0)