关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

时间:2021-08-23 21:49:59

因为做网站的静态页缓存,所以做了这个测试

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()));
}
}

测试结果

运行环境: 笔记本电脑本地测试。

执行结果:

  1. count = 20

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

  2. count = 100

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

  3. count = 200

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

  4. 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()));
    }

关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

  1. count = 1000

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

  2. count = 1500

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

总结

按照过去看过的资料描述 ,应该是 AsyncController虽然会因为线程切换而使单个请求增加额外的处理时间,但使耗时的操作不再占用工作线程,从而可以让IIS在相同时间内可以响应更多的请求,提高吞吐率。

第二组Action(延时2秒)的测试结果数据确实反映了这一效果。

但第一组读取本地文件的测试结果则是 单个请求的处理时间,异步Action明显高于同步不说,处理相同请求数所消耗的时间也是异步高于同步……,磁盘文件的并发读取是不是有什么限制呢?,待确认。

UrlRewrite

  1. 在已经完成MapHandler后就不能重写了,所以一般在BeginRequest的时候,执行重写
  2. IIS的url不区分大小写
  3. ///////home//////index//////////////////,request.Url.PathAndQuery依然是/home/index/
  4. /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();
}
}
}
}
}
  1. count = 20

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

  2. count = 100

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

  3. count = 1000

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

另一台电脑上的测试(Cpu A8)

  1. count = 20

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)
  2. count = 500

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

测试 服务器?

  1. count = 20

    关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

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

关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)

关于AysncController的一次测试(url重写后静态页文件内容的读取是否需要使用异步?)的更多相关文章

  1. iis7下url重写后,已存在的html不能访问了&lpar;未能执行URL&rpar;的解决方法

    iis7下url重写后,原本存在的html不能访问了,未能执行URL(asp.net对真正的.html(但不符合重写规的)就不知道如何处理了),遇到类似情况的朋友可以参考下   当把.html的url ...

  2. url重写后发布出错问题

    iis7 配置urlrewriter重写失效的问题 在IIS7下,如果使用微软的 URLRewriter 重写控件则需要在WEB.CONFIG中配置以下信息 第一个配置: <configSect ...

  3. ThinkPHP5&period;X PHP5&period;6&period;27-nts &plus; Apache 通过 URL 重写来隐藏入口文件 index&period;php

    我们先来看看官方手册给出关于「URL 重写」的参考: 可以通过 URL 重写隐藏应用的入口文件 index.php ,Apache 的配置参考: 1.http.conf 配置文件加载 mod_rewr ...

  4. IIS集成模式下,URL重写后获取不到Session值

    近期给公司网站添加了伪静态功能,但是今天发现了在伪静态的页面中,Session值是获取不到的. 原因是在伪静态请求的时候,Session请求被“过滤”掉了. 开始是把web.config文件中的mod ...

  5. ASP&period;NET中Url重写后&comma;打不开真正的Html页面

    不对IIS配置.html的映射,IIS站点目录下.html页面都能显示.当配置了.html的映射 IIS站点目录下真实存在的.html页面无法显示,错误信息:“页面无法显示”解决方法:1.首先照旧在网 ...

  6. php 获取当前url,可以规避框架url重写后还有index&period;php的情况

    function get_url(){ $pageURL = 'http'; if ($_SERVER["HTTPS"] == "on") { $pageURL ...

  7. nginx反向代理&plus;缓存开启&plus;url重写&plus;负载均衡&lpar;带健康探测&rpar;的部署记录

    在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能. 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测) ...

  8. 伪命题&colon;PHP识别url重写请求

    手上有一个网站,然后启用了伪静态,因为一些设置上的原因,一段时间后,发现收录的都是.php的文件,而启用的伪静态地址则收录很少,在更改设置后,想尽快去掉.php的收录,然后想将.php的地址转向.ht ...

  9. Asp&period;net实现URL重写

    原文:Asp.net实现URL重写 [概述] URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.重写URL是非常有用的一个功能,因为它可以让你提高搜索引擎阅读 ...

随机推荐

  1. html中使用js&plus;table 实现分页

    本文在html中利用js+table实现分页.主要思想是先对table中的所有数据隐藏,然后通过当前页面(currPageNum)来计算当前页要显示的行,并显示出来,首页.下一页.上一页.尾页都依此来 ...

  2. 【Bootstrap】2&period;作品展示站点

    假设我们已经想好了要给自己的作品弄一个在线站点.一如既往,时间紧迫.我们需要快一点,但作品展示效果又必须专业.当然,站点还得是响应式的,能够在各种设备上正常浏览,因为这是我们向目标客户推销时的卖点.这 ...

  3. MySQL学习笔记——增删改查

    有关数据库的DML操作 -insert into -delete.truncate -update -select -条件查询 -查询排序 -聚合函数 -分组查询 DROP.TRUNCATE.DELE ...

  4. linux下安装编译php的curl扩展

    curl扩展的位置(需要编译的版本)/root/install/php-5.5.24/ext/curl 1.进入对应的扩展目录 # cd /root/install/php-5.5.24/ext/cu ...

  5. 【C&plus;&plus;】C&plus;&plus;求vector中的最大最小值

    利用algorithm库里的max_element和min_element可以得到vector的最大最小值,配合distance函数可以得到最大值的位置 #include<vector> ...

  6. home-brew 安装&amp&semi;下载

    安装: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&qu ...

  7. C&num;查找子串在原串中出现次数

    提供的是一种思路,和具体语言无关. string test = "good good study day day up"; string r = test.Replace(&quo ...

  8. shell中的循环语句

    for语法格式 for var in list;do commands done 其中list可以包含: 1) 直接写 for alpha in a b c d;do echo $alpha done ...

  9. 后台自动启动appium

    首先说明,本人用的exe方式安装的appium. 新建一个.vbs文件,写入以下脚本,记得把D盘换成你自己的盘符. 1.后面taskkill好像没有实际作用..加就加了吧. Set ws = Crea ...

  10. Apache Spark 2&period;2&period;0 中文文档 - 集群模式概述 &vert; ApacheCN

    集群模式概述 该文档给出了 Spark 如何在集群上运行.使之更容易来理解所涉及到的组件的简短概述.通过阅读 应用提交指南 来学习关于在集群上启动应用. 组件 Spark 应用在集群上作为独立的进程组 ...