2009-05-26 17 views
4

またはobjThatIsString.ToString()それはaswersで指摘されたよう.. より速くない賢明..C#の方が高速です - System.Convert.ToString(objThatIsString)または(string)objThatIsString?

+2

私はスピードの違いが非常に心配する価値はないと思うので、Convert.ToStringはちょうど内部的にキャストを行います。 –

+0

@ Nathan - ただし、メソッド呼び出しの余分なオーバーヘッドがあります。一般的に操作はメソッドより高速ですが、私はこれがマイクロ最適化であることに完全に同意します。 – annakata

+0

@annakataもちろん、それはマイクロ最適化の確かなケースです。 –

答えて

14

後に直接キャストは実行時の型チェックを除いてすべてのチェックを行う必要はありません - 私はキャストが迅速であることを期待します。

また、objThatIsString.ToString()を考慮する必要があります。 (stringの場合)これはちょうどreturn this;であるため、速くなければなりません - 確かにConvert.ToStringより速いでしょう。レースはランタイム型チェックと仮想呼び出しの間にあります。実際には、どちらも非常に迅速です。

+0

あなたの期待は以下のテスト結果と一致します! – thijs

2

キャスト(string)objが速くなければなりません。 Convertクラスは、実際には異なるクラスのオブジェクトを変換し、この場合は遅くなります。

0

私は(string) objThatIsStringが速いと思います。これは、コンパイラがこの変換をコンパイル時に行うことができるためです。

しかし、ジェフ・アトウッドが重要ではないと考えているすべての(Coding Horror: The Sad Tragedy of Micro-Optimization Theater

+1

コンパイラは、*変数*が文字列であるとわかっている場合にのみ入ります。それ以外の場合は、ランタイム・タイプ・チェックが発行されます。 –

5

キャストが高速です。

Convert.ToStringは最終的にオーバーヘッドの後にキャストします。実際にはIConvertibleにキャストしようとした後、仮想メソッドToStringを呼び出します。したがって、実際のキャストをStringにする仮想呼び出しです。

1

「数字がその話を伝えます」という言葉があります。つまり、何かを仮定するのではなく、それを測定することもできます!

テストアプリをまとめてテストを実行し、結果を検証してください。

真の質問は次のようになります。 どのように高速化されているかを測定するにはどうすればよいですか?

15

@thijs:中

public class ToStringTest 
{ 
    private object mString = "hello world!"; 
    Stopwatch sw = new Stopwatch(); 
    private List<long> ConvertToStringTimes = new List<long>(); 
    private List<long> ToStringTimes = new List<long>(); 
    private List<long> CastToStringTimes = new List<long>(); 

    public ToStringTest() 
    { 

     for (int i = 0; i < 100000; i++) 
     { 
      sw.Start(); 
      ConvertToString(); 
      sw.Stop(); 
      ConvertToStringTimes.Add(sw.ElapsedTicks); 
      sw.Reset(); 

      sw.Start(); 
      ToString(); 
      sw.Stop(); 
      ToStringTimes.Add(sw.ElapsedTicks); 
      sw.Reset(); 

      sw.Start(); 
      CastToString(); 
      sw.Stop(); 
      CastToStringTimes.Add(sw.ElapsedTicks); 
      sw.Reset();  
     } 
     Console.WriteLine("Average elapsed ticks after converting {0} strings",ConvertToStringTimes.Count); 
     Console.WriteLine("ConvertToString: {0} ticks", ConvertToStringTimes.Average()); 
     Console.WriteLine("ToString: {0} ticks", ToStringTimes.Average()); 
     Console.WriteLine("CastToString: {0} ticks", CastToStringTimes.Average()); 
    } 

    private string ConvertToString() 
    { 
     return Convert.ToString(mString); 
    } 

    public override string ToString() 
    { 
     return mString.ToString(); 
    } 

    public string CastToString() 
    { 
     return (string) mString; 
    } 
} 

結果::

100000の文字列

ConvertToStringを変換した後

平均経過ティック:586.51461ティック:611.97372は

ToStringメソッドダニここ は、簡単なテストです

CastToString:582.25266 ticks

+0

最後に、 "shoulds"や "woulds"がない答え:いい仕事です。 – thijs

+1

ニース - 明確な+1;質問がwikiになったときはわかりませんが、残念です。 IMOにはいくつかのポイントがあります。 –

+0

たぶん彼は利他的だ:) – Skurmedel

関連する問題