C# string.format、string.connectと+=演算効率計算

7329 ワード

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();

            }
        }
    }
}

テスト結果:
531
109
125
time1(format) : time2(connect) : time3(operator) =  4.248 : 0.872 : 1
 
531
109
109
time1(format) : time2(connect) : time3(operator) =  4.872 : 1.000 : 1
 
515
125
109
time1(format) : time2(connect) : time3(operator) =  4.725 : 1.147 : 1
 
531
109
109
time1(format) : time2(connect) : time3(operator) =  4.872 : 1.000 : 1
 
531
125
109
time1(format) : time2(connect) : time3(operator) =  4.872 : 1.147 : 1
 
531
109
109
time1(format) : time2(connect) : time3(operator) =  4.872 : 1.000 : 1
 
531
109
109
time1(format) : time2(connect) : time3(operator) =  4.872 : 1.000 : 1
 
531
109
109
time1(format) : time2(connect) : time3(operator) =  4.872 : 1.000 : 1
 
531
125
109
time1(format) : time2(connect) : time3(operator) =  4.872 : 1.147 : 1
 
531
109
125
time1(format) : time2(connect) : time3(operator) =  4.248 : 0.872 : 1 
 
 
理由:
    string.牙列缺损connectはすべて新しいアドレスの割り当てとスタックに入る操作を実行したがstring.formatは各スタック文字について判断し、{d+}という置換文字が現れると、{d+}に対応する文字シーケンスがスタックに入る.そしてstring.connectはスタックにのみ作成され、スタック文字のチェックや判断は行われません.インスタック操作が完了すると、スタック操作を行い、スタック内の文字を順番にスタックに入れます.理論的にはstringformat操作の文字列が長ければ長いほど効率が低下します.
注意:d+はstring format=「my{0}is{1}」などの数字を表します.の0と1