using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace StringFormatEfficiency{ class PRogram { static void Main(string[] args) { string format = "my {0} is {1}"; string name = "name"; string zhangyaolin = "zhangyaolin"; string my = "my "; string iss = " is "; DateTime start = new DateTime(); DateTime end = new DateTime(); string aa = null; int maxcount = 10e6; for (int ii = 0; ii < 10; ii++) { start = DateTime.Now; for (int i = 0; i < maxcount; i++) { aa = string.Format(format, name, zhangyaolin); } end = DateTime.Now; TimeSpan ts1 = end - start; Console.WriteLine(ts1.Milliseconds.ToString()); //------------------------- start = DateTime.Now; for (int i = 0; i < maxcount; i++) { aa = string.Concat(my, name, iss, zhangyaolin); } end = DateTime.Now; TimeSpan ts2 = end - start; Console.WriteLine(ts2.Milliseconds.ToString()); //-------------------------- start = DateTime.Now; for (int i = 0; i < maxcount; i++) { aa = my + name + iss + zhangyaolin; } end = DateTime.Now; TimeSpan ts3 = end - start; Console.WriteLine(ts3.Milliseconds.ToString()); Console.WriteLine("time1(format) : time2(connect) : time3(Operator) = {0} : {1} : 1", (1.0 * ts1.Milliseconds / ts3.Milliseconds).ToString(“F3”), (1.0 * ts2.Milliseconds / ts3.Milliseconds).ToString(“F3”)); Console.WriteLine(); } } }}測試結(jié)果:
531109125time1(format) : time2(connect) : time3(operator) = 4.248 : 0.872 : 1531109109time1(format) : time2(connect) : time3(operator) = 4.872 : 1.000 : 1515125109time1(format) : time2(connect) : time3(operator) = 4.725 : 1.147 : 1531109109time1(format) : time2(connect) : time3(operator) = 4.872 : 1.000 : 1531125109time1(format) : time2(connect) : time3(operator) = 4.872 : 1.147 : 1531109109time1(format) : time2(connect) : time3(operator) = 4.872 : 1.000 : 1531109109time1(format) : time2(connect) : time3(operator) = 4.872 : 1.000 : 1531109109time1(format) : time2(connect) : time3(operator) = 4.872 : 1.000 : 1531125109time1(format) : time2(connect) : time3(operator) = 4.872 : 1.147 : 1531109125time1(format) : time2(connect) : time3(operator) = 4.248 : 0.872 : 1原因: string.format和string.connect都執(zhí)行了新地址分配和入棧操作,不過string.format會對每個(gè)入棧字符檢查判斷,當(dāng)有{/d+}這種替換字符出現(xiàn)時(shí),會將{/d+}對應(yīng)的字符序列入棧;而string.connect只做入棧,不做入棧字符的檢查和判斷。入棧操作完成時(shí),做出棧操作,將棧內(nèi)字符有序的放入堆里。理論上來說,string.format操作的字符串越長,效率越低。注:/d+表示一個(gè)數(shù)字,如string format = "my {0} is {1}";中的0和1新聞熱點(diǎn)
疑難解答
圖片精選