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

  • 相关阅读:
    PAT 1006 Sign In and Sign Out
    PAT 1004. Counting Leaves
    JavaEE开发环境安装
    NoSql数据库探讨
    maven的配置
    VMWARE 下使用 32位 Ubuntu Linux ,不能给它分配超过3.5G 内存?
    XCODE 4.3 WITH NO GCC?
    在苹果虚拟机上跑 ROR —— Ruby on Rails On Vmware OSX 10.7.3
    推荐一首让人疯狂的好歌《Pumped Up Kicks》。好吧,顺便测下博客园可以写点无关技术的帖子吗?
    RUBY元编程学习之”编写你的第一种领域专属语言“
  • 原文地址:https://www.cnblogs.com/ice-arrow/p/14144509.html
Copyright © 2011-2022 走看看