3

キューが実際のAzureストレージを指す非常に単純なテストを行っていますが、理由はわかりません。コンピューターからテストを実行する方が、ワーカーの役割をazureにデプロイしてそこで実行するよりもはるかに高速です。ローカルでテストするときにDevStorageを使用していません。私の.cscfgには、実ストレージへの接続文字列が含まれています。

ストレージアカウントとロールは同じアフィニティグループにあります。

テストは、Webの役割とワーカーの役割です。このページは、実行するテストをワーカーに通知し、ワーカーはそれを実行して、消費した時間を返します。この特定のテストでは、32個のメッセージのバッチを使用してAzureキューから1000個のメッセージを取得するのにかかる時間を測定します。まず、アプリをAzureにデプロイしてそこから実行した後、VSでデバッグの実行をテストします。

結果は次のとおりです。

  • 私のコンピューターから:34805.6495ミリ秒。
  • Azureの役割から:7956828.2851ミリ秒。

つまり、Azureの内部よりも外部からキューにアクセスする方が高速であり、意味がありません。

私はこのようにテストしています:

    private TestResult InQueueScopeDo(String test, Guid id, Int64 itemCount)
    {
        CloudStorageAccount account = CloudStorageAccount.Parse(_connectionString);
        CloudQueueClient client = account.CreateCloudQueueClient();
        CloudQueue queue = client.GetQueueReference(Guid.NewGuid().ToString());

        try
        {
            queue.Create();
            PreTestExecute(itemCount, queue);

            List<Int64> times = new List<Int64>();
            Stopwatch sw = new Stopwatch();
            for (Int64 i = 0; i < itemCount; i++)
            {
                sw.Start();
                Boolean valid = ItemTest(i, itemCount, queue);
                sw.Stop();
                if (valid)
                    times.Add(sw.ElapsedTicks);
                sw.Reset();
            }

            return new TestResult(id, test + " with " + itemCount.ToString() + " elements", TimeSpan.FromTicks(times.Min()).TotalMilliseconds,
                                                 TimeSpan.FromTicks(times.Max()).TotalMilliseconds,
                                                 TimeSpan.FromTicks((Int64)Math.Round(times.Average())).TotalMilliseconds);
        }
        finally
        {
            queue.Delete();
        }

        return null;
    }

は、1000個のPreTestExecuteアイテムをそれぞれ2048バイトでキューに入れます。

そして、これはItemTestこのテストのメソッドで起こることです:

    Boolean done = false;
    public override bool ItemTest(long itemCurrent, long itemCount, CloudQueue queue)
    {
        if (done)
            return false;

        CloudQueueMessage[] messages = null;

        while ((messages = queue.GetMessages((Int32)itemCount).ToArray()).Any())
        {
            foreach (var m in messages)
                queue.DeleteMessage(m);
        }

        done = true;

        return true;
    }

私は間違っていること、同じコード、同じ接続文字列ではなく、これらの結果を得ました。

何か案が?

アップデート:

問題は私がそれを計算する方法にあるようです。

times.Add(sw.ElapsedTicks);fortimes.Add(sw.ElapsedMilliseconds);とこのブロックを置き換えました:

return new TestResult(id, test + " with " + itemCount.ToString() + " elements",
TimeSpan.FromTicks(times.Min()).TotalMilliseconds,                             
TimeSpan.FromTicks(times.Max()).TotalMilliseconds,     
TimeSpan.FromTicks((Int64)Math.Round(times.Average())).TotalMilliseconds);

これのために:

return new TestResult(id, test + " with " + itemCount.ToString() + " elements", 
times.Min(),times.Max(),times.Average());

そして今、結果は似ているので、どうやら精度の扱い方などに違いがあるようです。これについては後で調べます。

4

2 に答える 2

2

ここで説明されているように、問題はどうやら StopWatch と TimeSpan ティックの異なる性質の問題でした。

Stopwatch.ElapsedTicks プロパティ

ストップウォッチ ティックは、DateTime.Ticks とは異なります。DateTime.Ticks 値の各ティックは、100 ナノ秒間隔を表します。ElapsedTicks 値の各ティックは、1 秒を Frequency で割った時間間隔を表します。

于 2011-05-03T14:27:24.593 に答える
1

CPU使用率はどうですか?コードが CPU を急増させており、ワークステーションが Azure ノードよりもはるかに高速である可能性はありますか?

于 2011-04-27T21:00:22.040 に答える