关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)
因为做网站的静态页缓存,所以做了这个测试
MVC项目
准备了4个Action,分两组,一组是读取本地磁盘的一个html页面文件,一组是延时2秒
public class TestController : Controller
{
public ActionResult Article(string name)
{
string path = @"I:\c#\nn.html";
using (StreamReader reader = new StreamReader(path))
{
return Content(reader.ReadToEnd());
}
}
public async Task<ActionResult> Article2(string name)
{
string path = @"I:\c#\nn.html";
using (StreamReader reader = new StreamReader(path))
{
return Content(await reader.ReadToEndAsync());
}
}
public ActionResult Index1()
{
Thread.Sleep(2000);
return Content("synchronized");
}
public async Task<ActionResult> Index2()
{
await Task.Delay(2000);
return Content("asynchronized");
}
}
控制台程序,测试代码
class Program
{
static void Main(string[] args)
{
var syncUrl = "http://localhost:61771/Test/Article";
var asyncUrl = "http://localhost:61771/Test/Article2";
var syncUrl2 = "http://localhost:61771/Test/Index1";
var asyncUrl2 = "http://localhost:61771/Test/Index2";
var count = 20;
int i = 0;
while (true)
{
Console.WriteLine();
Benchmark(asyncUrl, count);
Benchmark(syncUrl, count);
Benchmark(asyncUrl2, count);
Benchmark(syncUrl2, count);
i++;
if (Console.ReadKey().Key == ConsoleKey.C)
{
break;
}
}
Console.ReadKey();
}
static void Benchmark(string url, int count)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
var threads = new List<Thread>();
var countdown = new CountdownEvent(count);
for (int i = 0; i < count; i++)
{
threads.Add(new Thread(() =>
{
using (var client = new WebClient())
{
client.DownloadData(url);
countdown.Signal();
}
}));
}
for (int i = 0; i < count; i++)
{
threads[i].Start();
}
while (!countdown.IsSet) ;
stopwatch.Stop();
Console.WriteLine(string.Format("{0} costs {1} ms", url, stopwatch.ElapsedMilliseconds.ToString()));
}
}
测试结果
运行环境: 笔记本电脑本地测试。
执行结果:
count = 20





count = 100





count = 200





count = 500
测试时WebClient抛出了请求超时的警告,
代码调整如下:public class NewWebClient : WebClient
{
private int _timeout;
public NewWebClient()
{
this._timeout = 60000;
} public NewWebClient(int timeout)
{
this._timeout = timeout;
} protected override WebRequest GetWebRequest(Uri address)
{
var result = base.GetWebRequest(address);
result.Timeout = this._timeout;
return result;
}
} static void Benchmark(string url, int count)
{
var stopwatch = new Stopwatch();
stopwatch.Start(); var threads = new List<Thread>();
var countdown = new CountdownEvent(count);
for (int i = 0; i < count; i++)
{
threads.Add(new Thread(() =>
{
using (var client = new NewWebClient(30 * 60 * 1000))
{
client.DownloadData(url);
countdown.Signal();
}
}));
} for (int i = 0; i < count; i++)
{
threads[i].Start();
} while (!countdown.IsSet) ; stopwatch.Stop(); Console.WriteLine(string.Format("{0} costs {1} ms", url, stopwatch.ElapsedMilliseconds.ToString()));
}





count = 1000





count = 1500


总结
按照过去看过的资料描述 ,应该是 AsyncController虽然会因为线程切换而使单个请求增加额外的处理时间,但使耗时的操作不再占用工作线程,从而可以让IIS在相同时间内可以响应更多的请求,提高吞吐率。
第二组Action(延时2秒)的测试结果数据确实反映了这一效果。
但第一组读取本地文件的测试结果则是 单个请求的处理时间,异步Action明显高于同步不说,处理相同请求数所消耗的时间也是异步高于同步……,磁盘文件的并发读取是不是有什么限制呢?,待确认。
UrlRewrite
- 在已经完成MapHandler后就不能重写了,所以一般在BeginRequest的时候,执行重写
- IIS的url不区分大小写
- ///////home//////index//////////////////,request.Url.PathAndQuery依然是/home/index/
- /index.html/ 末尾带斜杠访问一个动态页可以正常访问(样式可能会乱掉),但访问一个静态页会报404
补充测试
protected void Application_BeginRequest()
{
var context = HttpContext.Current;
var request = context.Request;
if (request.RequestType == "GET")//过滤所有API
{
string regularUrl = request.Url.PathAndQuery;
if (regularUrl.StartsWith("/Test/Article3"))
{
context.RewritePath("/Project_Readme.html");
}
else if (regularUrl.StartsWith("/Test/Article4"))
{
string path = context.Server.MapPath("~/Project_Readme.html");
if (File.Exists(path))
{
using (StreamReader reader = new StreamReader(path))
{
context.Response.Write( reader.ReadToEnd());
context.Response.End();
}
}
}
}
}
count = 20

count = 100

count = 1000

另一台电脑上的测试(Cpu A8)
- count = 20

- count = 500

测试 服务器?
- count = 20

因为用的是360导航的首页另存为得到的一个静态页,内容太多,当通过网络访问页面时,带宽和流量就成为了一个很大的制约因素,之后更换了一个大小适当的页面后速度有明显提升,不过直接访问静态页路径速度并没有明显提升了……。

关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)的更多相关文章
- iis7下url重写后,已存在的html不能访问了(未能执行URL)的解决方法
iis7下url重写后,原本存在的html不能访问了,未能执行URL(asp.net对真正的.html(但不符合重写规的)就不知道如何处理了),遇到类似情况的朋友可以参考下 当把.html的url ...
- url重写后发布出错问题
iis7 配置urlrewriter重写失效的问题 在IIS7下,如果使用微软的 URLRewriter 重写控件则需要在WEB.CONFIG中配置以下信息 第一个配置: <configSect ...
- ThinkPHP5.X PHP5.6.27-nts + Apache 通过 URL 重写来隐藏入口文件 index.php
我们先来看看官方手册给出关于「URL 重写」的参考: 可以通过 URL 重写隐藏应用的入口文件 index.php ,Apache 的配置参考: 1.http.conf 配置文件加载 mod_rewr ...
- IIS集成模式下,URL重写后获取不到Session值
近期给公司网站添加了伪静态功能,但是今天发现了在伪静态的页面中,Session值是获取不到的. 原因是在伪静态请求的时候,Session请求被“过滤”掉了. 开始是把web.config文件中的mod ...
- ASP.NET中Url重写后,打不开真正的Html页面
不对IIS配置.html的映射,IIS站点目录下.html页面都能显示.当配置了.html的映射 IIS站点目录下真实存在的.html页面无法显示,错误信息:“页面无法显示”解决方法:1.首先照旧在网 ...
- php 获取当前url,可以规避框架url重写后还有index.php的情况
function get_url(){ $pageURL = 'http'; if ($_SERVER["HTTPS"] == "on") { $pageURL ...
- nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能. 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测) ...
- 伪命题:PHP识别url重写请求
手上有一个网站,然后启用了伪静态,因为一些设置上的原因,一段时间后,发现收录的都是.php的文件,而启用的伪静态地址则收录很少,在更改设置后,想尽快去掉.php的收录,然后想将.php的地址转向.ht ...
- Asp.net实现URL重写
原文:Asp.net实现URL重写 [概述] URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读 ...
随机推荐
- Objective-C日记-之KVC
KVC(Key-Value-Coding?) 1, 概述 以字符串形式向对象的实例变量或属性(Property)发送或者获得值的方法. 2,用法 a,取值 @property (readwrite,c ...
- [.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型)
[.net 面向对象程序设计深入](24)实战设计模式——策略模式(行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它 ...
- 很污的机器学习:从xhamster网站找到喜欢的片子
前言 最近迷上了看黄片(大雾).每次总是去搜索想看的片子,什么asian porn anal pussy 什么的我都不知道. 搜索着搜索着我手也累了,而且我喜欢的片子也是有一定的特征的,我不想把所有的 ...
- 好多鱼 Java
牛客网的题目: 链接:https://www.nowcoder.com/questionTerminal/e3dd485dd23a42899228305658457927牛牛有一个鱼缸.鱼缸里面已经有 ...
- Linux基础命令操作实例
1.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 2.使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 使用快捷键Ctrl+Alt+F2切换到终 ...
- HTML+CSS-采用DIV+CSS布局的利弊
单纯的TABLE表格,在浏览器运行上面来说,其效率不如DIV+CSS方式快速,当然,这样也就会影响用的体验. 而且,针对于相同的HTML页面来说TABLE布局,不利于搜索引擎的爬虫爬行下载页面.从而造 ...
- C# 在PDF中创建和填充域
C# 在PDF中创建和填充域 众所周知,PDF文档通常是不能编辑和修改的.如果用户需要在PDF文档中签名或者填写其他内容时,就需要PDF文档中有可编辑的域.开发者也经常会遇到将数据以编程的方式填充到P ...
- 机器学习基石 5 Training versus Testing
机器学习基石 5 Training versus Testing Recap and Preview 回顾一下机器学习的流程图: 机器学习可以理解为寻找到 \(g\),使得 \(g \approx f ...
- 初用Linux, 安装Ubuntu16.04+NVIDIA387+CUDA8.0+cudnn5.1+TensorFlow1.0.1
因为最近Deep Learning十分热门, 装一下TensorFlow学习一下. 本文主要介绍安装流程, 将自己遇到的问题说明出来, 并记录自己如何处理, 原理方面并没有能力解释. 由于本人之前从来 ...
- MyBatis极速入门开发手册(2017-2-6更新)
前言: 本篇文章对我的学习内容做一个归纳梳理,同时也记录一些学习过程中遇上的问题及注意事项等等,可以帮助新入门的朋友们消除一些误区与盲区,希望能帮上一些正在学习的朋友们.在编写时会引用一些mybati ...