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,來確定合適的編碼環境。