Warum ist mein Single-Threading-Code schneller als mein Multithreading-Code?
Ich habe einen einfachen Code geschrieben, um einige Schlüsselwerte aus einer JSON-Zeichenfolge abzurufen, aber wenn ich zum Multithread gehe, wird er jedes Mal langsamer, damit er den Wert mehrmals schnell abruft. Ich bin mir nicht ganz sicher, warum das passiert. Ich dachte, es könnte etwas mit meiner CPU zu tun haben. Das Hinzufügen einer Wartefunktion scheint das Problem zu beheben, führt jedoch zu einer extrem langsamen Funktion. Ich habe keine Ideen mehr und bin mir nicht sicher, was die Ursache ist.
Ausgabe:
Single Threaded
598
Elapsed=0.558
598
Elapsed=0.121
598
Elapsed=0.127
598
Elapsed=0.127
598
Elapsed=1.167
598
Elapsed=0.122
598
Elapsed=0.124
598
Elapsed=0.145
598
Elapsed=0.146
598
Elapsed=0.12
------------------------------
Multi Threading
598
Elapsed=0.129
598
Elapsed=0.179
598
Elapsed=0.227
598
Elapsed=0.299
598
Elapsed=0.326
598
Elapsed=0.396
598
Elapsed=0.427
598
Elapsed=0.505
598
Elapsed=0.525
598
Elapsed=0.703
private static void Test2() {
Stopwatch sw = new Stopwatch();
sw.Start();
using (WebClient wb = new WebClient()) {
wb.Proxy = null;
string data = wb.DownloadString("https://google.com");
sw.Stop();
Console.WriteLine("Elapsed={0}", (double)sw.ElapsedMilliseconds / 1000);
}
}
static void Main(string[] args) {
Console.WriteLine("Single Threaded");
Test2();
Test2();
Test2();
Test2();
Test2();
Test2();
Test2();
Test2();
Test2();
Test2();
Console.WriteLine("------------------------------");
Console.WriteLine("Multi Threading");
for (int i = 0; i < 10; i++) {
void Multi() {
Test2();
}
new Thread(Multi).Start();
}
Console.Read();
}
Antworten
Nur zum Vergleichen; Ich habe ein wenig mit asynchronem Code umgeschrieben. Viel Wiederverwendung von OPs-Code, ich weiß, dass es einige alte Sachen gibt, aber lassen Sie es uns vorerst so lassen.
Single Threaded: Elapsed = 2.688
Multi Threaded: Abgelaufen = 0,317
AMD 8-Core-CPU
public class ThreadingTests
{
private static async Task Test2()
{
await Task.Delay(1); // only here to make method async
using var wb = new WebClient { Proxy = null };
var data = wb.DownloadString("https://www.roblox.com/users/inventory/list-json?assetTypeId=41&cursor=&itemsPerPage=100&pageNumber=1&userId=539720021");
dynamic parsed = JObject.Parse(data);
}
[Test]
public async Task SingleTest()
{
Console.WriteLine("Single Threaded");
var sw = new Stopwatch();
sw.Start();
for (var i = 0; i < 10; i++)
{
await Test2();
}
sw.Stop();
Console.WriteLine("Elapsed={0}", (double)sw.ElapsedMilliseconds / 1000);
}
[Test]
public async Task MultiTest()
{
Console.WriteLine("Multi Threaded");
var sw = new Stopwatch();
sw.Start();
var taskList = new List<Task>();
for (var i = 0; i < 10; i++)
{
taskList.Add(Test2());
}
await Task.WhenAll(taskList);
sw.Stop();
Console.WriteLine("Elapsed={0}", (double)sw.ElapsedMilliseconds / 1000);
}
}