gpt4 book ai didi

c# - 为什么异步会减慢独立的后续代码?

转载 作者:行者123 更新时间:2023-11-30 20:34:36 25 4
gpt4 key购买 nike

我有一个方法,由我的 UI 线程触发,加载一些数据。 UI 线程并不立即需要这些数据。大部分数据来自数据库,部分数据从文件中读取。使数据库读取异步后,文件读取变慢。

这是我原来的加载方法的样子:

public void load() {
var sw = new Stopwatch();

sw.Start();
db1.loadDB();
sw.Stop();
Console.WriteLine("DB1: " + sw.Elapse.Milliseconds);

sw.Restart();
db2.loadDB();
sw.Stop();
Console.WriteLine("DB2: " + sw.Elapse.Milliseconds);

sw.Restart();
db3.loadDB();
sw.Stop();
Console.WriteLine("DB3: " + sw.Elapse.Milliseconds);

sw.Restart();
file.loadFile();
sw.Stop();
Console.WriteLine("File: " + sw.Elapse.Milliseconds);
}

因为每个数据库 loadDB 方法都执行多个数据库查询,所以我认为异步实现它们可能是个好主意。

public void load() {
var sw = new Stopwatch();

sw.Start();
taskDB1 = db1.loadDBAsync();
sw.Stop();
Console.WriteLine("DB1: " + sw.Elapse.Milliseconds);

sw.Restart();
taskDB2 = db2.loadDBAsync();
sw.Stop();
Console.WriteLine("DB2: " + sw.Elapse.Milliseconds);

sw.Restart();
taskDB3 = db3.loadDBAsync();
sw.Stop();
Console.WriteLine("DB3: " + sw.Elapse.Milliseconds);

sw.Restart();
file.loadFile();
sw.Stop();
Console.WriteLine("File: " + sw.Elapse.Milliseconds);
}

任务在另一个方法中等待,该方法在 UI 线程实际需要数据时调用。

令我困扰的是执行 loadFile 方法所花费的时间。在异步实现 loadDB 之前,它们每个都需要大约 100 毫秒才能完成,而 loadFile 方法大约需要 20 毫秒才能完成。 loadDBAsync 的异步实现大约需要 5 毫秒才能完成。但在第二个示例中,loadFile 方法需要 50 毫秒才能完成。我根本没有更改 loadFile 方法。

异步数据库访问怎么会减慢文件读取速度?

编辑:添加了我用来测量时间的代码。数据库在同一个磁盘上,至少现在是这样。 5ms是提交任务。

最佳答案

Why does async slow down independent, subsequent code?

代码不是独立的。

它与并发执行的异步代码共享一个缓慢的资源:物理磁盘。

您的文件读取速度较慢,因为磁盘正在同时读取数据。

请注意,如果您有一个不可扩展的数据库,那么让您的数据库操作并发通常是没有意义的。您要做的就是引起磁盘抖动,很可能最终会花费更长。使用优质的 SSD,您可能会收支平衡,但要更快并发数据库访问几乎是不可能的。

关于c# - 为什么异步会减慢独立的后续代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38970531/

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