zoukankan      html  css  js  c++  java
  • setlocale对语法解析中的影响

      一次查加载速度变慢的问题时,通过接口排查,发现调用引擎创建场景时,速度相比以前慢了一倍之多,并且小场景时影响较小,大场景影响非常大。于是开始了对引擎以及外部代码的非查。后来经过排查,发现主要问题出现在引擎创建场景接口的调用期间。

      随后进行了外部和内部进行排查,发现外部调用setLocale后导致该接口明显变慢。

      而查到的变慢的相应接口中,不出意外的在做语法和句法的解析。其中处理了大量的字符串,而场景小时,字符中比较少,影响相对较小,而场景变大时,字符串以及处理量几何级数增加,因此大场景时影响明显。禁用掉该函数后,加载速度明显变快。

      因此在字符处理时,该函数使用城要谨慎。setLocale改变系统对字符串的处理方式(如编码格式,显示方式等),进一步的还会影响到了字符串的处理速度和效率。

    以下是网上查到的类似案例及解析:

       …………………………………………………………………………………………………………

    setLocale是C库中的一个设置地域化信息的C函数。

    函数原型为:

    char *setlocale(int category, const char *locale)

    参数解释:

    • category -- 这是一个已命名的常量,指定了受区域设置影响的函数类别。

      • LC_ALL 包括下面的所有选项。
      • LC_COLLATE 字符串比较。参见 strcoll()。
      • LC_CTYPE 字符分类和转换。例如 strtoupper()。
      • LC_MONETARY 货币格式,针对 localeconv()。
      • LC_NUMERIC 小数点分隔符,针对 localeconv()。
      • LC_TIME 日期和时间格式,针对 strftime()。
      • LC_MESSAGES 系统响应。
    • locale -- 如果locale是NULL 或空字符串"",则区域名称将根据环境变量值来设置,其名称与上述的类别名称相同。

    最近项目中需要使用xdelta3进行二进制文件的增量更新,测试代码输入编码为GBK,printf输出的中文也显示正常,但xdelta3执行的结果就不尽如人意了。

    如上图,上面printf输出的中文是正常的,下面xdelta输出的结果就是乱码的。

    问一同事,说宽字符可以解决这个问题。测试显示正常,如下图。

    经历过一番经历后,总算是解决了这个问题。

    做技术的人总喜欢寻根问底,于是大胆猜测是不是setLocale函数起了作用。于是修改测试代码,宽字符改为普通字符,加上setLocale函数,再测,结果还是正常的。

    测试代码如下图:

    总结:

    windows环境下,setLocale会改变字符的编码环境设置。有些应用程序依赖系统的编码环境,则需要添加setLocale,来确定合适的编码环境。

    原文链接 https://www.cnblogs.com/zhugaopeng/p/9801136.html

  • 相关阅读:
    独家干货!两种低代码模型驱动开发技术对比
    GeneXus低代码产品版本大更新,助力打造专业开发团队,加速企业数字化转型!
    企业级低代码平台应具备哪些要素?(下)
    如何选择低代码平台?GeneXus低代码平台
    C语言结构体的“继承”
    C语言实现wake on lan(网络唤醒)
    Linux驱动中的异步通知
    Linux网络设备驱动概述
    Linux下的广播程序
    DCMA86P2网卡成功显示802.11p
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/14144509.html
Copyright © 2011-2022 走看看