gpt4 book ai didi

c# - 为什么 Console.WriteLine(...) 太慢了?还有其他选择吗?

转载 作者:行者123 更新时间:2023-11-30 21:42:17 25 4
gpt4 key购买 nike

似乎 Console.WriteLine(...) 在 C# 中真的很慢。

这是我测试过的代码。

var iterations = 5000;
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++)
Console.WriteLine("adsdsaddhfuihdsuifhdsufudshfoadfdshoadsuoadsuioadsihfuidh");
watch.Stop();
double msPerOp = 1.0 * watch.ElapsedMilliseconds / iterations;
Console.WriteLine("{0} ms/op", msPerOp);

在我的笔记本电脑中,它打印 5.731 ms/op

为什么这么慢?

据我所知,用其他语言打印到控制台并没有这么慢。例如,在 Go 中,具有相同字符串的 fmt.Println(...) 在我的笔记本电脑中只需要 416275 ns/op (= 0.416275 ms/op)

(使用 go test -bench 测试。)

为什么 Console.WriteLine(...) 在 C# 中这么慢?有没有我可以使用的替代方案,其性能与 Go 的 fmt.Println(...) 相似?

编辑)我需要快速 Console.WriteLine(...) 的原因如下。

我的应用程序通过 Windows 消息循环连续接收大量实时数据(20~80 个数据/秒),我想在每次使用 Console.WriteLine 接收时简单地打印数据。我应该快速打印它,否则实时数据会延迟。

但是,Console.WriteLine(...) 似乎需要 5~10 毫秒(对于长字符串)..这对于实时数据处理来说太慢了。

最佳答案

我不知道你的笔记本电脑是否真的那么慢,但对我来说(发布版本,在 Windows 7 x64 工作站上运行)你的测试代码输出是 0.056 毫秒/操作。

我尝试了 WinAPI WriteConsole 函数作为比较,它根本没有提高性能(0.0586 毫秒/操作)。

你可以自己比较,是否会得到不同的结果。

public class Program
{
public enum StandardHandleType
{
STD_INPUT_HANDLE = -10,
STD_OUTPUT_HANDLE = -11,
STD_ERROR_HANDLE = -12
}

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern IntPtr GetStdHandle(StandardHandleType handleType);

[System.Runtime.InteropServices.DllImport("kernel32.dll")]
public static extern bool WriteConsole(
IntPtr hConsoleOutput,
string lpBuffer,
int nNumberOfCharsToWrite,
ref int lpNumberOfCharsWritten,
IntPtr lpReserved
);

static void Main()
{
IntPtr console = GetStdHandle(StandardHandleType.STD_OUTPUT_HANDLE);

int written = 0;

var iterations = 5000;
var watch = new Stopwatch();
watch.Start();
string s = "adsdsaddhfuihdsuifhdsufudshfoadfdshoadsuoadsuioadsihfuidh\n";
for (int i = 0; i < iterations; i++)
//Console.WriteLine("adsdsaddhfuihdsuifhdsufudshfoadfdshoadsuoadsuioadsihfuidh");
WriteConsole(console, s, s.Length, ref written, IntPtr.Zero);
watch.Stop();
double msPerOp = 1.0 * watch.ElapsedMilliseconds / iterations;
Console.WriteLine("{0} ms/op", msPerOp);
Console.ReadKey();
}
}

关于c# - 为什么 Console.WriteLine(...) 太慢了?还有其他选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42670818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com