0

1 スレッドでファイルをダウンロードすると、0.1 秒かかりました。しかし、同じファイルを 100 スレッドでダウンロードすると、ダウンロードごとに 10 秒かかりました。ソースコード:

private static int _threadsCount;
private static string _url;

private static void Main(string[] args)
{
    _url = ConfigurationManager.AppSettings["Url"];

    int threadsLimit = 1;

    if (0 != args.Length)
        threadsLimit = int.Parse(args[0]);

    for (int i = 0; i < threadsLimit; i++)
    {
        var thread = new Thread(Start);
        thread.Start();
    }

    while (_threadsCount < threadsLimit)
    {
        Thread.Sleep(1000);
    }

    Console.WriteLine("Done");
}

static void Start()
{
    var webClient = new WebClient();

    var stopwatch = new Stopwatch();
    stopwatch.Reset();

    stopwatch.Start();

    for (int i = 1; i <= 10; i++)
    {
        webClient.DownloadData(_url);
    }

    stopwatch.Stop();

    Console.WriteLine(stopwatch.ElapsedMilliseconds);

    Interlocked.Increment(ref _threadsCount);
}

したがって、100 スレッドでプログラムを実行すると、ファイルごとに 10 秒の速度になります。しかし、2 番目のプログラムを 1 つのスレッドで同時に実行すると、1 ファイルあたり 0.1 秒の速度になります。したがって、問題はインターネットの速度ではありません。

スレッドの数が増えるとダウンロード速度が低下するのに、他のプロセス (同じファイル) には影響しないのはなぜですか? 1つのプロセスで速度を上げる方法は?

4

2 に答える 2

1

1) 構成ファイルでこのパラメーターを調整できます (デフォルト値は 2 です)。

<system.net>
    <connectionManagement>
        <add address="*" maxconnection="2" />
    </connectionManagement>
</system.net>

2) プログラムに複数のソケットを作成させるには、異なるアプリケーション ドメインからダウンロードします。

于 2013-10-04T12:10:41.453 に答える
0
  1. ネットワーク アダプタは 1 つだけです。これがボトルネックになる可能性があります
  2. 同じサーバーからダウンロードしていますか? これがボトルネックになる可能性があります
  3. スレッドにはコストがかかります。CPU 上のスレッド間の切り替え (コンテキスト切り替え) には時間がかかり、100 CPU を実行しているとは思えません。
于 2013-10-04T11:52:37.187 に答える