我正试图在iPhone上找到最佳的incode性能监控方法.
在Windows平台上,我将使用以下功能:
QueryPerformanceCounter((LARGE_INTEGER*)&ctr);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
iPhone上有这样的东西吗?什么是最高分辨率我可以在不使用仪器或鲨鱼等外部工具的情况下计时?
System.Diagnostics中是否有内置方法用于检索给定CategoryName的所有实例化性能计数器?
我们有许多使用自定义性能计数器的多线程应用程序,现在需要添加一个仪表板来显示性能统计信息.
我想以这样的方式制作仪表板,只要有人在新代码中添加新计数器,就不需要更新它.
好吧,前几天我将特定代码片段的性能从34秒提高到2秒,我正在计算相同的百分比,即(34-2)/ 34,即94.11%,当我在会议中告诉这个数字时没有那么惊讶..我想知道这是否是我传达的错误号码..
你如何衡量改进并同时看起来很好?
根据如何使用.NET PerformanceCounter来跟踪每个进程的内存和CPU使用情况? PerformanceCounter应该给我一个给定进程的内存使用次数.
根据MSDN,Process实例也可能给我或多或少相同的数字.
为了验证我的假设,我写了以下代码:
class Program
{
static Process process = Process.GetCurrentProcess();
static PerformanceCounter privateBytesCounter = new PerformanceCounter("Process", "Private Bytes", process.ProcessName);
static PerformanceCounter workingSetCounter = new PerformanceCounter("Process", "Working Set", process.ProcessName);
static void Main(string[] args)
{
GetMeasure();
Console.WriteLine("\nPress enter to allocate great amount of memory");
Console.ReadLine();
int[] arr = new int[10000000];
for (int i = 0; i < arr.Length; i++)
{
arr[i] = i;
}
GetMeasure();
privateBytesCounter.Dispose();
workingSetCounter.Dispose();
Console.ReadKey();
}
private static void GetMeasure() …Run Code Online (Sandbox Code Playgroud) 我的一位同事确信Oracle的odp.net ado.net实现中存在内存泄漏.他编写了一个测试程序来测试这个理论,并在调用每个对象上的dispose之后执行以下操作,以确定释放多少内存:
PerformanceCounter p = new PerformanceCounter("Memory", "Available Bytes");
GC.Collect();
GC.WaitForPendingFinalizers();
float mem = p.NextValue();
Run Code Online (Sandbox Code Playgroud)
然后将得到的性能值与在处置对象之前检索的值进行比较.这会产生准确的结果吗?
在Agner Fog的优秀微体系结构中 .pdf (第9.14节)我读到:
存储转发在以下情况下有效:[...]当写入128或256位后,读取相同大小和相同的地址,对齐16.
另一方面,我阅读了英特尔架构优化参考手册(2.2.5.2 Intel Sandy Bridge,L1 DCache)
在以下情况下,存储无法转发到负载:[...]任何跨越32字节存储的16字节边界的负载.
任何负载听起来像32字节加载..我写了以下简单的代码来测试这一点,似乎32字节存储不转发到Sandy Bridge架构上的后续32字节加载.这是代码:
#include <stdlib.h>
#include <malloc.h>
int main(){
long i;
// aligned memory address
double *tempa = (double*)memalign(4096, sizeof(double)*4);
for(i=0; i<4; i++) tempa[i] = 1.0;
for(i=0; i<1000000000; i++){ // 1e9 iterations
#ifdef TEST_AVX
__asm__("vmovapd %%ymm12, (%0)\n\t"
"vmovapd (%0), %%ymm12\n\t"
:
:"r"(tempa));
#else
__asm__("movapd %%xmm12, (%0)\n\t"
"movapd (%0), %%xmm12\n\t"
:
:"r"(tempa));
#endif
}
}
Run Code Online (Sandbox Code Playgroud)
在循环中唯一做的是从4k对齐的存储器位置和向量寄存器读取/写入.使用AVX指令集(gcc -O3 -DTEST_AVX)编译时,我的2.7GHz i7-2620M的执行时间为3.1秒.使用SSE2指令集时,时间为2.5秒.我看了一下性能指标.在AVX情况下,我计算每次迭代一次存储转发块事件(计数器03H 02H LD_BLOCKS.STORE_FORWARD).计数器为SSE2情况读取0.
任何人都可以对此有所了解吗?SB确实不支持将32字节存储转发到32字节加载吗?如果是后者,溢出ymm …
如何在perfom中启用ODP.NET托管驱动程序的性能计数器以便能够监视它们?目前我根本无法在perfmon中看到"Oracle Data Provider for .NET"类别.
我试图在配置脚本中注册xcopy安装包(ODP.NET_Managed121010.zip)中的计数器,但相关部分以错误结束:
OraProvCfg/action:register/product:odpm/component:perfcounter /providerpath:"D:\svnroot\tech\Nasadzovanie\Assemblies\Oracle.ManagedDataAccess\tmp\odp.net\managed\x64\..common\Oracle.ManagedDataAccess .dll"错误:注册ODP计数器时遇到问题
我的app.config的相关部分是正确的我希望:
<configSections>
<section name="oracle.manageddataaccess.client"
type="OracleInternal.Common.ODPMSectionHandler,
Oracle.ManagedDataAccess, Version=4.121.1.0,
Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="PerformanceCounters" value="4095" />
</settings>
</version>
</oracle.manageddataaccess.client>
Run Code Online (Sandbox Code Playgroud) 在我们的应用程序中,我们使用Windows性能计数器来存储我们的一些应用程序指标,这些指标稍后会在某些Web服务中检索.
我遇到了从计数器读取值所花费的时间问题.我已经浏览了我的应用程序的其余部分,一切都很好,性能明智,但从循环中的计数器(从列表或数组)读取需要花费大量的时间.
示例代码:
// This triggers a read of the counter's initial value (1000ms delay following for calculated counters)
counters.ToList().ForEach(counter => counter.NextValue());
Run Code Online (Sandbox Code Playgroud)
在我对上面的循环的测试中,1,359个计数器的列表需要20秒,并且使用秒表,似乎读取计数器值的平均时间是0-10ms,或大约80-90ms.其中很多都需要0ms,最高约为170ms,平均非零值约为80-90ms.
也许我太乐观了,但我认为读取1,000个数值应该只需要几毫秒.这里有更多的处理工作比我知道的还要多吗?
我实际上在我的逻辑中有另一个循环,它获得计算计数器的第二个值.这只会使情况变得更糟.:)
谢谢!
我把计数器检索包裹在一个秒表中,我对结果感到惊讶.阅读即使是简单的属性.RawValue仍然需要花费过多的时间.据我所知,计数器基本上都是一样的,检索应该非常快; 奇怪的是,我也看到了网络类别的计数器需要更长时间的模式.
根据http://joe.blog.freemansoft.com/2014/03/windows-performance-counters.html,性能计数器服务的性能甚至不应该是一个考虑因素.
我已将一些秒表结果发布到以下的pastebin:http://pastebin.com/raw.php?i = aDJk2Tru
我的代码如下:
Stopwatch t;
foreach (var c in counters)
{
t = Stopwatch.StartNew();
var r = c.RawValue;
Debug.WriteLine(t.ElapsedMilliseconds.ToString("000") + " - " + c.CategoryName + ":" + c.CounterName + "(" + c.CounterType + ") = " + r);
}
Run Code Online (Sandbox Code Playgroud)
正如您在粘贴中看到的那样,很多读取都是0,但在50-100ms范围内有很多.我真的不明白这是怎么回事.当然,一个计数器值应该和其他值一样快,对吧?
我使用perf脚本命令来查看perf.data文件的结果,但我真的不明白每个列的含义.例如,如果我有以下结果:
perf 3198 [000] 13156.201238: bus-cycles: ffffffff81086e90 resched_task
perf 3198 [000] 13156.201267: instructions: ffffffff811868e9 do_vfs_ioctl
Run Code Online (Sandbox Code Playgroud)
什么是价值观3198,[000],13156.201238指的是?
for (int i = 0; i < 100000; ++i) {
int *page = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
page[0] = 0;
munmap(page, PAGE_SIZE);
}
Run Code Online (Sandbox Code Playgroud)
我期望在用户空间中获得~100000 dTLB-store-miss,每次迭代一次(同样~100000页错误和内核的dTLB-load-miss).运行以下命令,结果大约是我期望的2倍.如果有人能澄清为什么会这样,我将不胜感激:
perf stat -e dTLB-store-misses:u ./test
Performance counter stats for './test':
200,114 dTLB-store-misses
0.213379649 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)
PS我已经验证并确定生成的代码没有引入任何可以证明这个结果的东西.此外,我确实得到~100000页错误和dTLB加载未命中:k.