我注意到一个有趣的性能变化,大约有150万个输入值.有人能给我一个很好的解释,为什么会这样?
表非常简单.它由(bigint,bigint,bigint,bool,varbinary(max))组成.我在前三个bigint上有一个pk clusered索引.我只插入布尔"true"作为数据varbinary(max).
从那时起,表现似乎非常稳定.
图例:Y(以毫秒为单位)| X(插入10K)

我也很好奇我在图上有不断的相对较小(有时非常大)的峰值.
来自尖峰之前的实际执行计划.

图例:
我插入的表:TSMDataTable
1. BigInt DataNodeID - fk
2. BigInt TS - 主
时间戳3.BigInt CTS - 修改时间戳
4.位:ICT - 保留最后插入值的记录(提高读取性能)
5.数据: Data
Bool值当前时间戳保持不变
环境
它是本地的.
它不共享任何资源.
它是固定大小的数据库(足以使它不扩展).
(电脑,4核,8GB,7200rps,Win 7).
(Sql Server 2008 R2 DC,处理器亲和力(核心1,2),3GB,)
sql-server performance-testing sql-server-2008 sql-server-2008-r2 sql-server-performance
我的网页上有一些浏览器密集型的CSS和动画,我想确定用户是否有快速PC,因此我可以相应地扩展内容以提供最佳体验.
我正在使用http://detectmobilebrowser.com的脚本来检测所有移动设备,我将包括该子句/android|ipad|ipod|playbook|silk/i.test(a)以包括所有平板电脑设备.
然而,这不能也不能真正解决实际的硬件问题.绘制一张我正在寻找的图片并不是很遥远.
例如,iPhone 4S将比移动用户代理检测器匹配的许多设备具有更强大的功能,而这使得它无法将自己与众不同.有人可能会在奔腾II机器上运行谷歌浏览器(不知何故),并希望查看我的页面.(这个人可能没有iPhone 4S)
显然,为了实际获得这个想法,我将不得不做一些实际的性能测试,并且与任何类型的应用程序的性能测试一样,仅测试应用程序实际执行的任务类型的性能是有意义的.
即使考虑到这一点,我觉得在性能测试程序花费太长时间并且用户已经变得不耐烦之前,很难获得任何合理准确的数字.所以这可能意味着继续它,除非我希望第一次初步印象是完美的.嗯,事实恰恰是这种情况.因此,我无法在"第一次运行后"测量性能并稍后调整参数.
所以我剩下的就是基本上尝试在初始页面加载时执行类似的任务,其方式取决于浏览器渲染和处理速度,同时不向用户呈现任何内容(这样他们仍然认为对用户该页面正在加载),然后优选地在一秒或两秒内获得足够精确的数字以设置实际页面的参数以使其成为动画并以不喜欢幻灯片放映的令人愉悦的方式呈现.
也许我可以<div>在我的测试用例上放置一个整页白色,以便我可以阻止用户看到正在发生的事情,并希望浏览器不会通过避免完成所有工作而变得聪明.
有没有人这样做过?
我知道人们会说,"你可能不需要这样做",或者"必须有更好的方法"或"减少影响的数量".
做我在页面上做的任何事情的原因是它看起来很好.这就是它的全部要点.如果我不关心这个问题就不会存在.目标是让javascript能够确定足够的参数,以便在功能强大的计算机上提供出色的体验,并在功能较弱的计算机上提供可通过的体验.当有更多电力时,应该利用它.所以希望这可以解释为什么这些建议不是问题的有效答案.
什么是最快的?要根据循环内部或外部循环之外的变量做一个条件,或者它是否重要(编译器是否为你做了),或者你应该使用完全不同的变通方法?
示例#1中包含循环内的条件(单个foreach):
$test = 2;
foreach ($list as $listItem) {
if ($test == 1) {
$listItem .= " - one";
} else if ($test == 2) {
$listItem .= " - two";
} else if ($test == 3) {
$listItem .= " - three";
}
}
Run Code Online (Sandbox Code Playgroud)
示例#2,循环外的条件(多个foreach的丑陋):
$test = 2;
if ($test == 1) {
foreach ($list as $listItem) {
$listItem .= " - one";
}
} else if ($test == 2) {
foreach ($list as …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用visual studio 2012中"分析"菜单选项中的"启动性能向导"选项.它使用Internet Explorer作为默认浏览器.我需要将默认浏览器更改为"Firefox",因此当我启动性能向导时,Firefox将打开而不是Internet Explorer.谁能告诉我如何实现这一目标?
我有一个从多个MessageQueue实例读取的Windows服务.这些消息队列都有自己Task的阅读消息.通常,在阅读消息后,I/O数据库的工作就完成了.我发现文章声称在I/O操作上使用异步是个好主意,因为它可以释放线程.我正在尝试模拟在控制台应用程序中使用异步I/O操作的性能提升.
在我的测试环境中,我有10个队列.GetQueues()返回10个不同的MessageQueue实例.
static void Main(string[] args)
{
var isAsync = Console.ReadLine() == "Y";
foreach (var queue in queueManager.GetQueues())
{
var temp = queue;
Task.Run(() => ReceiveMessagesForQueue(temp, isAsync));
}
while (true)
{
FillAllQueuesWithMessages();
ResetAndStartStopWatch();
while(!AllMessagesRead())
{
Thread.Sleep(10);
}
Console.WriteLine("All messages read in {0}ms", stopWatch.ElapsedMilliseconds);
}
}
static async Task ReceiveMessagesForQueue(MessageQueue queue, bool isAsync)
{
while (true)
{
var message = await Task.Factory.FromAsync<Message>(queue.BeginReceive(), queue.EndReceive);
if (isAsync)
await ProcessMessageAsync(message);
else
ProcessMessage(message);
}
}
Run Code Online (Sandbox Code Playgroud)
c# performance-testing task-parallel-library async-await c#-5.0
我想按照这些说明操作
http://www.eclipse.org/tptp/home/documents/tutorials/profilingtool/profilingexample_32.html
并最终导致了这个未解决的问题:
我实际上使用的是Windows 7,但问题类似于上面针对Redhat报告的问题.
如何向Eclipse Luna添加Profiling和Logging透视图?
为什么正则表达式的输入长度不会影响性能,这怎么可能?
生成的字符串如下:128个随机字符.括号内有两个数字.这个重复了很多次.
128 radnom characters....(-2435346|45436) 128 radnom characters....(-32525562|-325346)
Run Code Online (Sandbox Code Playgroud)
正则表达式获取括号内的所有数字.这是模式.
\(([-+]?\d+\|[-+]?\d+)\)
Run Code Online (Sandbox Code Playgroud)
所以比赛就像
-2435346|45436
-32525562|-325346
etc...
Run Code Online (Sandbox Code Playgroud)
以下是执行基准测试的代码.我在生成输入后启动秒表,因为我只想评估匹配时间.
Random rand = new Random();
Func<string> getRandString = // generates 128 random characters.
() => Enumerable.Range(0, 128).Select(x => (char) rand.Next()).Aggregate("", (a, b) => a + b);
Func<int> getRandInteger = () => rand.Next(); // generates random number.
string format = "{0}({1}|{2})";
// Generate the big string.
StringBuilder bigstr = new StringBuilder();
for (int i = 0; i < 100; i++) // repeat 100 times.
{
bigstr.Append(string.Format(format, …Run Code Online (Sandbox Code Playgroud) 我们有一个webapp,它通过.NET IHttpHandler(称为proxy.ashx)路由许多请求,用于CORS和安全目的.某些资源加载速度很快,而其他资源则根据这些资源所需的大量计算加载速度慢.这是预料之中的.
在负载很重的情况下,proxy.ashx会慢慢爬行,所有资源都会永远加载.在这些峰值加载时间内,如果绕过代理并直接加载资源,则会立即加载,这意味着代理是瓶颈.
(即http://server/proxy.ashx?url = http:// some_resource加载缓慢,但http:// some_resource自行加载速度快).
我有一个假设,即响应性降低是因为IHttpHandler是同步编码的,当有太多长时间运行的请求处于活动状态时,IIS请求线程都忙.我创建了一个快速A/B测试应用程序来验证我的假设,我的测试结果表明情况并非如此.
这篇文章是我基于请求线程池的理解.
在Web服务器上,.NET Framework维护一个用于为ASP.NET请求提供服务的线程池.当请求到达时,将调度池中的线程来处理该请求.如果同步处理请求,则在处理请求时阻止处理请求的线程,并且该线程无法为另一个请求提供服务....
但是,在异步调用期间,服务器在等待第一个请求完成时不会阻止响应其他请求.因此,当有许多请求调用长时间运行的操作时,异步请求会阻止请求排队.
在下面的示例中,理论上,同步处理程序应该在某个阈值之后占用请求线程,从而阻止更多新请求启动.异步处理程序应该允许更多的请求排队,因为每个请求几乎立即将其请求线程返回到线程池,等待它Task.Delay,允许该请求线程在前一个请求仍在等待时处理新请求.
同步HttpHandler
<%@ WebHandler Language="C#" Class="SyncHandler" %>
using System.Web;
using System.Threading;
public class SyncHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//BLOCKING artifical pause to simulate network activity
Thread.Sleep(300);
var Response = context.Response;
Response.Write("sync response");
}
public bool IsReusable { get { return true; } }
}
Run Code Online (Sandbox Code Playgroud)
异步处理程序
<%@ WebHandler Language="C#" Class="AsyncHandler" %>
using System.Web;
using System.Threading.Tasks;
public class …Run Code Online (Sandbox Code Playgroud) 我用Visual Studio cpu profiler(Debug> Performance Profiler> CPU Usage)来描述我的[.net框架]应用程序,它描述了性能并提供了详细的报告:
此工具也适用于.net核心,但结果有些不同,并且不便于用户分析细节.
例如,当我检查"调用树"视图时,根节点是dotnet.exe,这是预期的.树的第二层是所有被调用的方法.但是当我扩展它们时,我没有得到那些方法调用的方法,而是看到[coreclr.dll].所以我不能通过这种方法检查热线.见下面的截图:
我已尝试附加到运行进程[iisexpress]而不是使用启动项目选项,但结果是相同的.
我想知道是否存在更好的方法来获得性能分析结果,就像它在完整的框架中一样?
我知道.net核心有一些第三方分析器,但我更喜欢使用Visual Studio,如果它可以工作的话.
编辑1:添加了截图
编辑2 当启用从Microsoft Symbol Server下载符号时,我获得了一些不同的结果,但不是预期的结果.它没有显示[coreclr.dll],而是显示了一堆.net核心方法.但问题仍然存在:
如果我实现方法A()和B(),并且方法A()调用方法B(),那么B将不会嵌套在探查器报告调用树中的A节点内.相反,A会有一些来自coreclr的孩子.我无法理解这种行为的原因.
在以下代码段中,时间消耗为std::sort。这应该花费O(nlog(n))时间。std::chrono仅用于测量std::sort。
我使用具有优化级别的Intel编译器18.0.3编译了以下代码-O3。我使用Redhat6。
#include <vector>
#include <random>
#include <limits>
#include <iostream>
#include <chrono>
#include <algorithm>
int main() {
std::random_device dev;
std::mt19937 rng(dev());
std::uniform_int_distribution<std::mt19937::result_type> dist(std::numeric_limits<int>::min(),
std::numeric_limits<int>::max());
int ret = 0;
const unsigned int max = std::numeric_limits<unsigned int>::max();
for (auto j = 1u; j < max; j *= 10) {
std::vector<int> vec;
vec.reserve(j);
for (int i = 0; i < j; ++i) {
vec.push_back(dist(rng));
}
auto t_start = std::chrono::system_clock::now();
std::sort(vec.begin(), vec.end());
const auto …Run Code Online (Sandbox Code Playgroud) c# ×4
performance ×2
profiling ×2
.net ×1
.net-core ×1
apachebench ×1
asp.net-core ×1
async-await ×1
benchmarking ×1
c#-5.0 ×1
c++ ×1
eclipse ×1
eclipse-luna ×1
for-loop ×1
foreach ×1
html5 ×1
java ×1
javascript ×1
php ×1
regex ×1
sorting ×1
sql-server ×1
testing ×1
time ×1