- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在研究 Asp.Net Security,我发现了一些令人惊讶的代码:
context.Response.ContentType = "text/html";
await context.Response.WriteAsync("<html><body>");
await context.Response.WriteAsync("An remote error has occured: " + context.Request.Query["ErrorMessage"] + "<br>");
await context.Response.WriteAsync("<a href=\"/\">Home</a>");
await context.Response.WriteAsync("</body></html>");
让我吃惊的是使用短字符串多次调用 WriteAsync。
我会使用带有 String.Format 或 StringBuilder 的模板来连接字符串,然后在一次调用中编写:
var template = @"
<html><body>
An remote error has occured:{0}<br>
<a href=\"/\">Home</a>
</body></html>
";
var html = string.format(template, context.Request.Query["ErrorMessage"]);
await context.Response.WriteAsync(html);
如果应避免字符串连接,则应拆分这部分:
"An remote error has occured: " + context.Request.Query["ErrorMessage"] + "<br>"
为了讨论的目的。假设这是在平均同时有约 10,000 个活跃用户的 Web 服务器的上下文中:因此性能很重要。
最佳答案
我创建了一个 Azure 网站(在 Basic 1 - 1 小型实例上运行)来对其进行基准测试。然后我使用了https://loader.io的免费服务在 1 分钟内以每秒 100 个用户的速度运行每个测试。
我以不同的顺序对每个测试运行了 3 次。每次测试运行的时间都在 200 毫秒以内。
结果很明显:StringBuilder 显着获胜。每次异步调用的成本远远超过任何形式的字符串连接的成本(甚至 String.Format 的性能优于多次异步调用)。
这是每个测试的代码:
// Do not write this code - It is ugly and performs terribly
private async Task TestWriteAsync(HttpContext context)
{
var r = context.Response;
var id = "id";
var size = "12";
var text = "text";
await r.WriteAsync("<div style='display:none'>");
for (int i = 0; i < 10000; i++)
{
await r.WriteAsync("<li id='");
await r.WriteAsync(id);
await r.WriteAsync("' style='font-size:");
await r.WriteAsync(size);
await r.WriteAsync("'>");
await r.WriteAsync(text);
await r.WriteAsync("</li>");
}
await r.WriteAsync("</div>");
}
// This is much better, but still not great
private async Task TestWriteAsyncFormat(HttpContext context)
{
var r = context.Response;
var id = "id";
var size = "12";
var text = "text";
var template = "<li id='{0}' style='font-size:{1}'>{2}</li>";
await r.WriteAsync("<div style='display:none'>");
for (int i = 0; i < 10000; i++)
{
await r.WriteAsync(string.Format(template, id, size, text));
}
await r.WriteAsync("</div>");
}
// The Performance Winner, but ugly code
private async Task TestStringBuilder(HttpContext context)
{
var sb = new StringBuilder();
var id = "id";
var size = "12";
var text = "text";
sb.Append("<div style='display:none'>");
for (int i = 0; i < 10000; i++)
{
sb.Append("<li id='");
sb.Append(id);
sb.Append("' style='font-size:");
sb.Append(size);
sb.Append("'>");
sb.Append(text);
sb.Append("</li>");
}
sb.Append("</div>");
await context.Response.WriteAsync(sb.ToString());
}
// Decent performance and Clean Code
private async Task TestStringBuilderFormat(HttpContext context)
{
var sb = new StringBuilder();
var id = "id";
var size = "12";
var text = "text";
var template = "<li id='{0}' style='font-size:{1}'>{2}</li>";
sb.Append("<div style='display:none'>");
for (int i = 0; i < 10000; i++)
{
sb.AppendFormat(template, id, size, text);
}
sb.Append("</div>");
await context.Response.WriteAsync(sb.ToString());
}
因此,尽管旧的“Response.Write”比具有同步请求的 StringBuilder 快,但“await Response.WriteAsync”要慢得多(因为异步开销)。
关于c# - 多次 Response.writeAsync 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33940903/
我尝试编写一个带有超时的简单异步写入代码,如下所示,并期望该函数在给定非常大的缓冲区和小等待时间的情况下抛出 TaskCanceledException。但是,这不会发生。 WriteAsync 将阻
我正在使用异步调用将文件写入 IsolatedStorageFile async void Base64ToImage() { byte[] data; using (IsolatedS
我正在尝试通过TComPort组件异步发送字符串, 但是所有内容都是同步发送的。 问题在于该应用将被阻止,并等待传输结束。 我的代码: procedure TForm1.Button1Click(Se
我有一个 ASP.NET Core API,我为此编写了自定义中间件,以便我可以处理异常并在一个位置写入日志。通过 Kestrel 调试并从浏览器或 postman 提交请求时,中间件按要求工作,但在
我正在尝试调用在模拟HttpResponse 上模拟的WriteAsync,但我不知道要使用的语法。 var responseMock = new Mock(); responseMock.Setup
我正在尝试开发一个基本的 Windows 8 应用商店应用程序,只需创建一个新文件并向其中写入一些示例数据。但是,当我运行我编写的函数时,应用程序挂起并且变得没有响应。我尝试了两种不同的文件创建方法,
您好,如果有人可以向我解释这两种从 Controller 返回数据的方法之间的区别,我正在徘徊。使用 on 方法比其他方法有优势或理由吗? 我猜测返回的函数只是调用 Response.WriteAsy
使用 TcpClient 通过网络推送数据。客户端只发送数据。在某些时候,服务器可能会关闭套接字。服务器关闭套接字后,第一个客户端发送无异常完成。客户端第二次发送抛出 IOException。我本以为
我有一个 asp.net webforms 应用程序,用于从数据库中检索以 varbinary 格式保存的视频并将其显示为 html5 视频标记。 在谷歌搜索后,我找到了一种使用ASP.Net Web
如果我在 Login 调用完成后终止我的服务器,则在调用 stream.WriteAsync(data, 0, data.Count()); 已创建,返回的任务中没有错误指示。 那么,我应该如何检测错
我一直在 Ayende Rahien 的博客上试验一些代码 here它演示了使用异步 HttpHandler 来提高可并发处理的请求数。 不幸的是,我连最基本的例子都无法运行。我收到以下错误: 'Sy
我一直在研究 Asp.Net Security,我发现了一些令人惊讶的代码: 奇怪的代码? context.Response.ContentType = "text/html"; await cont
我必须通过蓝牙与设备进行通信,该设备期望命令由回车+换行分隔。使用 RFCOMMChannel 建立连接。 Atm 似乎我的代码无法正常工作,因为我期待设备的回复,当我使用 simpel 终端程序向它
当有一个 TcpClient 在多个线程中获取其 stream 并在每个线程上对其执行 WriteAsync 时。它是线程安全的吗?数据(传递给 write 方法的字节数组)是否会作为传递给 Writ
我对该代码有疑问, XpsDocument doc = new XpsDocument(_filePath, FileAccess.Read); XpsDocument = doc.GetFixedD
我正在将视频流录制到磁盘。为此,我使用以下代码: private async Task SaveToFile(IntPtr data, Int32 size) { if (_FileStrea
我正在查看 C# 中新的 async 和 await 关键字,只是想感受一下它们。 我正在查看 MSDN FileStream.WriteAsync() example ,而且我不确定我是否理解了什么
我一直在尝试实现一个支持 ReadAsync 和 WriteAsync 的 Stream,并考虑到 documentation 的冗余性,我正在努力了解如何正确执行此操作。具体来说,关于流的光标位置。
在 HttpWebRequest.GetRequestStream() 创建的流上取消 WriteAsync 操作时,我收到一个 WebException 并显示以下消息: Cannot close
异步向客户端写入数据时如何防止这个问题 The BeginWrite method cannot be called when another write operation is pending 我
我是一名优秀的程序员,十分优秀!