1. 程式人生 > 實用技巧 >setlocale對語法解析中的影響

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