-4

.net 組み込みメソッドを使用したパフォーマンスの問題の最も単純な例である以下のコードについて、ご意見をお聞かせください。オンライン チュートリアルで強く推奨されています。

    public void stringFormatVsConcatShowResults()
    {
        float timeFormat = 0, timeConcat = 0;
                for (int counter = 0; counter < 10; i++)
                {

                    if (counter % 2 == 0)
                         timeFormat += TestStrFormat(1000000, true);
                    else timeConcat += TestStrFormat(1000000);

                }


                if (timeFormat > timeConcat)
                {
                    float precWonBy = (timeConcat / timeFormat) * 100;
                    int prcfractionalPart = new Version(precWonBy.ToString()).Major;
                    MessageBox.Show("The fstest (by " + prcfractionalPart + " %)is Concat");
                }
                else
                {

                    float precWonBy = (timeConcat / timeFormat) * 100;
                    int precfractionalPart = new Version(precWonBy.ToString()).Major;
                    MessageBox.Show("The fstest (by" + precfractionalPart + " %)is string.Format()");
                }
        }


    public int TestStrFormat(int iterate, bool WstringFormat=false)
    {
        string testStr = string.Empty, Enewline = Environment.NewLine;
        const string header = "its iteration No': ", sign = " !";
        Stopwatch swStrFrm = new Stopwatch();
        swStrFrm.Start();
        if (WstringFormat)
        {

            for (int counter = 0; counter < iterate; i++)
            {
                testStr = string.Format("--{0}{1}{2}--{3}", header, counter, sign, Enewline);
            }

        }
        else
        {
                for (int counter = 0; counter < iterate; i++)
                {
                    testStr = "--its iteration No': " + counter + " !--" + Enewline ;
                }

        }
        swStrFrm.Stop();
        return Convert.ToInt32(swStrFrm.ElapsedTicks);
    }

何を選択しますか。また、このパフォーマンスの問題に注意してください。

これは単純な例にすぎません。

画面をビットマップにキャプチャしたり、画像をバイト[]に変換したりするなど、多くの方法があります...

私はソフトウェア開発に不慣れなので(4か月 - 独学)、複数のジャンクションでこれらの状況に遭遇しました。ここでは、決定する必要があるため、どの方法を使用するかを選択するにはどうすればよいですか?...アプリケーションで最大のパフォーマンスを発揮することを選択したとき、またはそれ(C#)の意図がそもそもパフォーマンスではなかったときはいつでも反逆します。

ただ電話stringFormatVsConcatShowResults()して、私が話していることを自分の目で確かめてください

  • 再編集

その後、長い文字列を使用すると、次のようになります。

    public int TestStrWStrBld(int iterate)
    {
        StringBuilder sb = new StringBuilder();

        const string header = "its iteration No': ", sign = " !";

        Stopwatch swStrFrm = new Stopwatch();
        swStrFrm.Start();


            for (int i = 0; i < iterate; i++)
            {
                sb.Append(header).Append(i).Append(sign).Append(Environment.NewLine);
            }


        swStrFrm.Stop();
        return Convert.ToInt32(swStrFrm.ElapsedTicks);
    }

StringBuilder が 600% 以上高速化したのは今でした

私の心を開いてくれてありがとう、これから...私は正しい実装を探し続けます。

  • ReEdit2 または小さい文字列の場合: 文字列と比較

Str = "a" + "b" + "c";

以下は800%高速です!!

    public int TestStrWStrBld(int iterate)
    {
        StringBuilder sb = new StringBuilder();

        const string header = "its iteration No': ", sign = " !";
        string str = string.Empty;
        Stopwatch swStrFrm = new Stopwatch();
        swStrFrm.Start();


            for (int i = 0; i < iterate; i++)
            {
                str= String.Concat(header, i.ToString(), sign,Environment.NewLine);

            }


        swStrFrm.Stop();
        return Convert.ToInt32(swStrFrm.ElapsedTicks);
    }

したがって、正しい方法は String.Concat(string1, string2, etc...) を使用することだと思います

4

2 に答える 2

3

複数のジャンクションで、何を使用するかを決定する必要がある状況に遭遇しました

あなたの質問は「使用する方法をどのように選択すればよいですか?」だと思います...

このシナリオではの方が高速ですが (私のマシンでは x64 ビルドで約 75% 高速です)、この場合、どちらのオプションでも十分String.Concatに機能すると思われます。実際のシナリオでは、このような単一の文字列を作成することがパフォーマンスのボトルネックになることはほとんどありません。大きな文字列を作成している場合は、これらのいずれよりも優れたオプションになる可能性があります...StringBuilder

読みやすさと保守性に基づいて、フレームワークで使用するメソッドを決定します。後でアプリケーションのプロファイルを作成し、問題が見つかった場合、その時点でこれをどのように調整するかを決定するのは非常に簡単です。

于 2012-09-06T15:57:48.797 に答える
1

チュートリアルでこれを行うように指示されていないことに驚いています:

for (int counter = 0; counter < iterate; i++)
            {
                testStr = new StringBuilder().Append("--its iteration No': ").Append(counter).Append(" !--").Append(Environment.NewLine).toString();
            }
于 2012-09-06T15:49:09.003 に答える