效率更高的整數轉化爲字符串函數

  整數轉化爲字符串的函數相信你們在作一些算法題的時候就已經作過,通常能想到的代碼以下:html

 1 size_t my_uint32_to_str(uint32_t value, char *dst)
 2 {
 3     size_t length = digits10(value);
 4     size_t len = length;
 5     while(value)
 6     {
 7         dst[length - 1] = '0' + (value % 10);
 8         length--;
 9         value /= 10;
10     }
11     return len;
12 }

  這是最簡單不過的轉化函數了,這個轉化函數代碼不多,並且簡單易懂。效率也不錯,可是下面這個功能相同的函數,效率更是搞得驚人,比上面跟這個函數快了將近 30%,代碼以下:git

 1 size_t facebook_uint32_to_str(uint32_t value, char *dst)
 2 {
 3     static const char digits[201] =
 4         "0001020304050607080910111213141516171819"
 5         "2021222324252627282930313233343536373839"
 6         "4041424344454647484950515253545556575859"
 7         "6061626364656667686970717273747576777879"
 8         "8081828384858687888990919293949596979899";
 9     size_t const length = digits10(value);
10     size_t next = length - 1;
11     while (value >= 100) {
12         const int i = (value % 100) * 2;
13         value /= 100;
14         dst[next] = digits[i + 1];
15         dst[next - 1] = digits[i];
16         next -= 2;
17     }
18     // Handle last 1-2 digits
19     if (value < 10) {
20         dst[next] = '0' + uint32_t(value);
21     } else {
22         const int i = uint32_t(value) * 2;
23         dst[next] = digits[i + 1];
24         dst[next - 1] = digits[i];
25     }
26     return length;
27 }

  這兩個函數都調用了 digists10()  函數,該函數用來統計一個十進制數的位數。因此這塊的影響能夠忽略,digists10() 函數代碼以下(我本身寫的,效率可能不是最好的):算法

 1 size_t digits10(uint32_t value)
 2 {
 3     int length = 0;
 4     while(value)
 5     {
 6         length++;
 7         value /= 10;
 8     }
 9     return length;
10 }

  如今咱們對比一下這兩個函數的執行效率,先貼出個人測試代碼:函數

 1 #define MAX 1000000
 2 int main()
 3 {
 4     clock_t begin, duration;
 5     int digit = 1, len = 0;
 6     char dst[6],dst2[6];
 7     begin = clock();
 8     for(int i= 0; i < MAX; i++)
 9     {
10         len = my_uint32_to_str(digit,dst);
11         dst[len] = '\0';
12     }
13     duration = clock() - begin;
14     printf( "函數 my_uint32_to_str 的運行時間大約爲:%dms\n", duration*1000/CLOCKS_PER_SEC );
15     //printf("%s",dst);
16     begin = clock();
17     for(int i= 0; i < MAX; i++)
18     {
19         len = facebook_uint32_to_str(digit,dst2);
20         dst2[len] = '\0';
21     }
22     duration = clock() - begin;
23     printf( "函數 facebook_uint32_to_str 的運行時間大約爲:%dms\n", duration*1000/CLOCKS_PER_SEC );
24     return 0;
25 }

  當 digists = 1 時,測試結果以下:測試

  

  當 digists = 11 時測試結果以下:ui

  當 digists = 101 時測試結果以下:spa

  當 digists = 1001 時測試結果以下:3d

  當 digists = 10001 時測試結果以下:code

  當 digists = 100001 時測試結果以下:htm

  當 digists = 1000001 時測試結果以下:

  當 digists = 10000001 時測試結果以下:

  當 digists = 100000001 時測試結果以下:

  當 digists = 1000000001 時測試結果以下:

  從測試結果咱們能夠看出,效率確實提升了不少。分析緣由,我以爲應該是 facebook_uint32_to_str() 函數大大縮減了  / (除)的操做。100 之內的不須要除法,而 my_uint32_to_str() 要進行 1~2 次除法;100~999,facebook_uint32_to_str() 要 1 次,my_uint32_to_str()  要 3 次;1000~9999, facebook_uint32_to_str() 要 1 次,my_uint32_to_str()  要 4 次;以此類推,facebook_uint32_to_str() 須要 digits/100 次除操做,而 my_uint32_to_str() 須要 digits 位數次除操做。

  本文參考連接:http://tia.mat.br/blog/html/2014/06/23/integer_to_string_conversion.html

相關文章
相關標籤/搜索