doubleが文字列として出力するいくつかの方法の効率テスト

3051 ワード

テスト結果:
 
double->none 366msdouble->long 161msdouble->long2 188msdouble->format 564msdouble->Round 393ms
 
コード:
 
using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Text;

using System.Threading.Tasks;



namespace testStringbuilder

{

    class Program

    {

        static void Main(string[] args)

        {

            const int count = 1000000;



            RunTest("double->none",()=>

            {

                StringBuilder sb = new StringBuilder(1000*1024*32);

                double a = 3.1415926;

                for (int i = 0; i < count; i++)

                {

                    sb.Append(a);

                    sb.Append(',');

                }

            });



            RunTest("double->long", () =>

            {

                StringBuilder sb = new StringBuilder(1000 * 1024 * 32);

                double a = 3.1415926;

                for (int i = 0; i < count; i++)

                {

                    sb.Append((long)a);

                    sb.Append(',');

                }

            });



            RunTest("double->long2", () =>

            {

                StringBuilder sb = new StringBuilder(1000 * 1024 * 32);

                double a = 3.1415926;

                for (int i = 0; i < count; i++)

                {

                    sb.Append((long)(a * 100));

                    sb.Append(',');

                }

            });



            RunTest("double->format", () =>

            {

                StringBuilder sb = new StringBuilder(1000 * 1024 * 32);

                double a = 3.1415926;

                for (int i = 0; i < count; i++)

                {

                    sb.AppendFormat("{0:f3}",a);

                    sb.Append(',');

                }

            });



            RunTest("double->Round", () =>

            {

                StringBuilder sb = new StringBuilder(1000 * 1024 * 32);

                double a = 3.1415926;

                for (int i = 0; i < count; i++)

                {

                    sb.Append(Math.Round(a, 3));

                    sb.Append(',');

                }

            });

        }



        private static void RunTest(string key, Action action)

        {

            double milli = 0;

            for (int i = 0; i < 3; i++)

            {

                Stopwatch watch = Stopwatch.StartNew();



                try

                {

                    action();

                }

                catch (Exception ex)

                {

                    Console.WriteLine(ex);

                }



                watch.Stop();

                milli += watch.ElapsedMilliseconds;

            }



            Console.WriteLine("{0}\t{1}ms", key, (long) (milli/3));

        }

    }

}