为了从EF 4.1获得单个回调,我可以编写的最小代码量是多少,它提供了以下内容:
OnSQLExecuted(DbCommand cmd, DateTime start, double durationMS, string stacktrace) 目前我们使用了一个似乎在泄露性能的令人讨厌的黑客,我很好奇我们如何能够以最小的影响对应用程序实现此回调.
我们能够通过黑客入侵Mini Minir来解决这个问题 - Database.DefaultConnectionFactory但是我们改变了默认工厂的默认情况意味着你不能同时拥有两个分析工厂.所以我们采取了更激进的路线.
常用的技术是相当直接的,你实现:DbProviderFactory,IDbConnectionFactory,DbProviderServices,DbConnection,DbCommand并DbDataReader以这样的方式,他们拦截电话和个人资料.
到目前为止,很容易......但是当你试图连接它时它会变得混乱:
try
{
// ensure all the factories are loaded
DbProviderFactories.GetFactory("...");
}
catch (ArgumentException)
{
}
Type type = typeof(DbProviderFactories);
DataTable table;
// SUPER UGLY - Can this be done in another way?
object setOrTable = (type.GetField("_configTable", BindingFlags.NonPublic | BindingFlags.Static) ??
type.GetField("_providerTable", BindingFlags.NonPublic | BindingFlags.Static)).GetValue(null);
if (setOrTable …Run Code Online (Sandbox Code Playgroud) 使用Firebug和Chrome开发人员工具,我可以看到通过动作加载一些javascript和css文件可能会在我的开发机器上花费额外的500ms.这种情况发生在不同调用的不同文件中,无论我将它们放入何种顺序都无关紧要.如果我直接链接到文件,则不会发生此500ms延迟.我可以反复刷新页面并获得不同的值,但它们总是看起来像请求时间中添加了500毫秒.如果我不断刷新页面,额外的500毫秒会出现在不同的单个文件上,有时会出现两个文件,其中一个是1000毫秒的延迟,如下图所示.
编辑
将Monitor.Enter放入我的HttpModule的BeginRequest和EndRequest中的Monitor.Exit导致延迟消失,所以我的猜测是它与线程化多个请求有关.
我使用Evan Nagel 在这里描述的方法进行缓存,但是当我用一个只传递原始文件的动作替换调用我自己的控制器的链接时,会发生同样的事情:
public FileResult RawFile(string path, string contentType)
{
var server = HttpContext.Server;
string decodedPath = server.UrlDecode(path);
string mappedPath = server.MapPath(decodedPath);
return File(mappedPath, contentType);
}
Run Code Online (Sandbox Code Playgroud)
这是我在html的head部分中的代码:
<link rel="stylesheet" href="@Url.Action("RawFile", new { controller = "Content", path = "~/Content/Site.css", contentType = "text/css" })" type="text/css" />
<script src="@Url.Action("RawFile", new { controller = "Content", path = "~/Scripts/debug/FBINFO.js", contentType = "application/x-javascript" })" type="text/javascript"></script>
<script src="@Url.Action("RawFile", new { controller = "Content", path = "~/Scripts/jquery-1.4.1.min.js", contentType = "application/x-javascript" })" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)
这似乎不会发生在我的生产服务器上,至少不会经常发生,但由于延迟通常较高,因此很难判断.这不用担心吗?会是什么原因造成的?它发生在Cassini和Windows 7 …
当我使用下面的函数创建我的上下文时,分析器显示从标准EF(版本4)上下文创建方法增加大约300ms.还有另一种方法可以做到更好的表现吗?它失败了性能分析的目的.
public static Models.MyEntities GetContext()
{
var profiler = MiniProfiler.Current;
var sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString);
var profiledConnection = MvcMiniProfiler.Data.ProfiledDbConnection.Get(sqlConn, profiler);
return ObjectContextUtils.CreateObjectContext<Models.MyEntities>(profiledConnection);
}
Run Code Online (Sandbox Code Playgroud)
第一个是使用上面的函数来创建上下文.第二种是使用标准的EF上下文创建方法.以下是使用mvc-mini-profiler的性能差异:
Profiler EF上下文:89.1
一些数据库命中:317.9
正常EF上下文:0.1
一些数据库命中:7.4
更新2:我在Visual Studio中进行了一些分析,看起来主要的耗时操作是MvcMiniProfiler.Helpers.StackTraceSnippet.Get(),并且在其中有一个对System.Diagnostics.StackTrace..ctor(bool)的调用.这需要很长时间才能完成,似乎是导致上述延迟的原因.