它可能发生在你身上

2021-03-07 11:55:29

几天前,一个迷人的Articleabout Grand Theft汽车on onlineMade The Tech New Ecosystem的回合。

我鼓励你阅读整件事,但总之,GTA Online在解析大型JSON Blob时意外地表现出了四元级,(由于重复呼叫Strlen);将这种改进的加载时间修复近70%。

由于许多仔细编程,它将在2013年MacBook Pro上开设大约165毫秒的BINARES,在大约165毫秒的平板下开放了97 MB二进制STLFILE。这令人垂涎欲滴。

固体cube_corner面正常0.0 -1.0 0.0外环顶点0.0 0.0 0.0 1.0顶点0.0 0.0顶点0.0 0.0 1.0 ENDLOOP endfacet面正常0.0 0.0 -1.0外环顶点0.0 0.0 0.0顶点0.0 1.0 0.0 1.0顶点0.0 0.0 ENDLOOP endfacet ... endsolid

/ *最自由的ASCII STL解析器:忽略除了单词&#39之外的所有内容;顶点'然后读取三个浮点数。 * /

加载ASCII STL总是似乎有点慢,但我假设你使用低效的文本格式来获得的。

我在几年内首次重新审视Erizo,以修复宏的焦点问题

在后续讨论中,我了解到,由于对SSCANF的呼叫重复,解析可能是二次级别的

[erizo](0.000000)main.c:10 |启动![erizo](0.162895)window.c:91 |创建窗口[erizo](0.162900)window.c:95 |制作上下文当前[erizo](0.168715)window.c:103 |初始化GLEW [ERIZO](0.178329)窗口:91 |创建的窗口[erizo](0.178333)window.c:95 |制作上下文当前[erizo](1.818734)Loader.c:109 |解析ASCII STL [ERIZO](1.819471)Loader.c:227 |工人有重复复杂的顶点[ERIZO](1.819480)Loader.c:237 |得到5146个顶点(7982三角形)[Erizo](1.819530)Loader.c:240 |等待缓冲区...... [ERIZO](1.819624)LOADER.c:326 |分配缓冲器[ERIZO](1.819691)Loader.c:253 |向工作线程发送缓冲区[ERIZO](1.819883)Loader.c:258 |加入工人线程[erizo](1.819887)Loader.c:279 | Loader Thread完成[Erizo](1.821291)instance.c:32 |显示窗口

/ *最自由的ASCII STL解析器:忽略除了单词&#39之外的所有内容;顶点'然后读取三个浮点数。 * / const char vertex_str [] ="顶点&#34 ;;虽然(1){data = strstr(数据,vertex_str);如果(!数据){break; } / *跳转到后面的第一个字符'顶点' * / data + = strlen(vertex_str); for(unsigned i = 0; i< 3; ++ i){skip_while(ISSPACE); float f; const int r = sscanf(数据,"%f"& f); abort_if(r == 0 || r == eof,"未能解析浮动"); if(buf_size == buf_count){buf_size * = 2;缓冲区=(float *)realloc(缓冲区,buf_size * sizeof(float));缓冲区[buf_count ++] = f; skip_while(!isspace); }}

您可以注意到SSCANF,愉快地坐在那里,读取单个浮动数据流的前面并每次检查整个字符串的长度。

是的,我已经提出了与在线GTA的程序员的完全相同的错误:我有一个意外的二次解析器!

用Strtof替换SSCANF调用,将启动改进的启动近一个10分:从1.8秒到199毫秒。

[erizo](0.000000)main.c:10 |启动![erizo](0.178082)window.c:91 |创建窗口[erizo](0.178086)window.c:95 |制作上下文当前[erizo](0.184226)窗口:103 |初始化GLEW [ERIZO](0.194469)窗口:91 |创建窗口[erizo](0.194472)window.c:95 |制作上下文当前[erizo](0.196126)Loader.c:109 |解析ASCII STL [ERIZO](0.196866)Loader.c:227 |工人有重复复杂的顶点[ERIZO](0.196871)Loader.c:237 |得到5146个顶点(7982三角形)[Erizo](0.196921)Loader.c:240 |等待缓冲区...... [ERIZO](0.197013)loader.c:326 |分配缓冲区[ERIZO](0.197082)Loader.c:253 |向工作线程发送缓冲区[ERIZO](0.197303)Loader.c:258 |加入工人线程[erizo](0.197306)Loader.c:279 | Loader Thread完成[Erizo](0.199328)instance.c:32 |显示窗口

这在&#34的噪音中回归;操作系统需要多长时间给我们一个OpenGL Context"这是一个高性能工具的好地方。 作为一直编制多年的人,这是一个完全定时的提醒,总有陷阱。SSCanfdoes的文档不包括时间复杂性,所以这尤其棘手的Sofgun,以及我肯定是'我肯定 #39;不是在黑暗中潜伏的唯一一个。 你可能没有得到如此完美的提醒,但它值得记住-Next时间你读了一个关于不良编程的迷人故事 - 这可能发生在你身上! (显然,故事的寓意是不要使用SSCANF在字符串的前面重复单个代币; I' M确定你和#39;我可以避免避免那个)