Articles of 性能

来自getaddrinfo的响应缓慢

我使用getaddrinfo在Windows上从C ++进行DNS查询。 我曾经使用的Windows API的DnsQuery和工作正常,但是当我的软件添加IPv6支持我切换到getaddrinfo。 从那以后,我看到了以下几点: 我的问题是有时getaddrinfo需要很长时间才能完成。 来自getaddrinfo的典型响应只需要几毫秒,但大约是10000次中的1次,需要更长的时间,有些情况下大约需要15秒,但是有几种情况需要几分钟时间。 我已经在服务器上运行Wireshark并分析了我的应用程序debugging日志,并看到以下内容: 我称之为函数getaddrinfo。 15秒钟后,我的机器查询DNS服务器。 几毫秒后,我得到来自DNS服务器的响应。 这里奇怪的是,实际的DNS查询只需要十分之一秒,但getaddrinfo实际执行的时间要长得多。 这个问题已经被很多用户所报道,所以这不是我的机器特有的。 那么getaddrinfo做什么比联系DNS服务器更多? 编辑: 问题发生在几个地址。 如果我尝试使用这些地址重现问题,则不会发生此问题。 我做了一些愚蠢的事情。 在每个DNS查询之后,etc / services被parsing。 但是,这并不能解释几分钟的延迟。 (谢谢D.Shawley) 编辑2 我的软件所做的一种DNS查询是反垃圾邮件DNSBL查询。 来自一个用户的日志告诉我,查找ip.address1.example.com似乎总是需要2039秒,而查找another.ip.address.example.com总是精确到1324秒。 之后的那一天,查找这些地址就好了。 起初我以为DNS BL的作者已经把某种超时放在了一边。 但如果这是核心问题,getaddrinfo应该早点超时了?

在Windows窗体中呈现文本最快的API?

我们需要优化一个C# Windows窗体应用程序的文本渲染,在不规则的网格中显示大量的小string。 在任何时候,可以有超过5000个可见的细胞,每秒更新4次。 字体系列和大小在整个单元格中是一致的,不过每个单元格的颜色可能会有所不同,粗体/斜体/平面也是如此。 我已经看到网上关于TextRenderer.DrawText与Graphics.DrawString是最快/最好的,这在Win32级别减less到GDI与GDI +比较冲突的信息。 在Windows XP和Windows Vista上我也看到了截然不同的结果,但我的主要目标是Windows XP。 在WinFX和DirectX 10下很有前途的文章在这里没有帮助:-) 这里最好的办法是什么? 我并不害怕引入一个小的C ++ / CLI层,并优化了设备上下文处理以挤出更多的性能,但是我希望得到一些明确的build议。 编辑:感谢您的初始答复。 我将尝试背景位图渲染和坚持与GDI等效调用的组合。

在窗口中获取进程的峰值私有字节值

ProcessExplorer以某种方式获取此值,并显示在每个进程的性能选项卡上…如何使用Win32 API获取它? 解决scheme:在“Peak Private Bytes”字段中,Process Explorer实际显示“Process \ … \ Page File Bytes Peak”性能计数器。 使用PSAPI函数GetProcessMemoryInfo可以轻松地检索此值。

Windows上的本地C ++有哪些好的分析器?

我正在寻找一个分析器来使用本机C ++。 它当然不一定是免费的,但是成本是影响购买决定的因素。 这是用于商业工作,所以我不能使用个人或学术许可的副本。 我正在寻找的关键function是: 过程级度量 组件级别指标 行级指标 支持multithreading代码 可用性 成本 需要Visual Studio 2005 Professional支持(VS 2008 Professional支持非常可取) 我已经使用了英特尔的VTune和Compuware的Devpartner性能分析社区版。 VTune看起来非常强大,但是它的学习曲线陡峭。 这也是非常“模块化”,所以你必须弄清楚你需要购买哪些零件。 DevPartner PACE非常易于使用,并提供了所有主要function,但只有45天的试用期。 行货版本(DevPartner for Visual C ++ BoundsChecker Suite)售价约1400美元,这是可行的,但有点高。 本地C ++和WHY有什么好的分析器? 也可以看看: 什么是你最喜欢的分析工具的C + +

使用多less个Windows句柄是“太多”了?

据我所知,这个问题的答案可能取决于registry设置和Windows的版本,也可能取决于RAM的数量,如果没有足够的内存。 为了这个问题,假定服务器有足够的RAM(3 + GiB)。 如果一个应用程序(这种情况下的第三方应用程序)以几百个小时的时间泄漏句柄,那么在其他应用程序遇到麻烦之前,该应用程序可以泄露多less个句柄? 我所说的“麻烦”是指,例如,无法启动线程,无法打开文件,等等。 我已经看到一些服务器(轻载)使用几万个句柄运行一个进程(通常是一个数据库进程),所以旧的10000句柄限制显然不是问题。 (无论如何,这是一个每个进程的限制,所以不会影响我的应用程序,在这一点之下)。 有人可以回答这个问题,也可以指出一些资源,解释一下Windows服务器在处理完(句柄或其他系统资源)之前可以处理多less个句柄?

需要在Windows / Python中快速创build大量的新进程

为了testing一些安全软件,我需要能够在Windows中创build大量(可configuration)的新进程(不是线程!),很快,它们存在一个(可configuration的)时间段,然后干净地终止。 进程不应该做任何事情 – 只存在指定的时间。 最终,我想能够运行如下的东西: C:\> python process_generate.py –processes=150 –duration=2500 这将很快创build150个新的进程,使他们都活着2500毫秒,然后让他们尽快终止。 作为一个起点,我跑了 from multiprocessing import Process import os def f(): pass if __name__ == '__main__': import datetime count = 0 startime = datetime.datetime.now() while True: p = Process(target=f) p.start() p.terminate() count += 1 if count % 1000 == 0: now = datetime.datetime.now() print "Started & […]

哪一个更快? 正则expression式或EndsWith?

什么会更快? public String Roll() { Random rnd = new Random(); int roll = rnd.Next(1, 100000); if (Regex.IsMatch(roll.ToString(), @"(.)\1{1,}$")) { return "doubles"; } return "none"; } 要么 public String Roll() { Random rnd = new Random(); int roll = rnd.Next(1, 100000); if (roll.ToString().EndsWith("11") || roll.ToString().EndsWith("22") || roll.ToString().EndsWith("33") || roll.ToString().EndsWith("44") || roll.ToString().EndsWith("55") || roll.ToString().EndsWith("66") || roll.ToString().EndsWith("77") || […]

通过networking读取文件由于额外的读取速度较慢

我正在读取一个文件,并且要么读取一行数据(1600个连续读取的17个字节),要么读取一列数据(以1600 * 17 = 27,200个字节分隔的17个字节的1600个读取)。 该文件位于本地驱动器或远程驱动器上。 我读取10次,所以我希望在每种情况下读取272,000字节的数据。 在本地驱动器,我看到了我的期望。 在远程驱动器上按顺序阅读时,我也看到了我所期望的,但是当阅读一个专栏时,我看到大量额外的读取正在完成。 它们的长度为32,768字节,似乎没有被使用,但是它们使得读取的数据量从272,000字节跳到79MB到106MB的任何地方。 这是使用进程监视器的输出: 1:39:39.4624488 PM DiskSpeedTest.exe 89628 ReadFile \\ BCCDC01 \ BCC-raid3 \ SeisWareInc Temp Dir \ BPepers_Temp \ Projects \ PT_4 \ Horizo​​ns \ BaseName3D_1 \ RR_AP SUCCESS Offset:9,390,069,Length:17 1:39:39.4624639 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\ BCCDC01 \ BCC-raid3 \ SeisWareInc Temp Dir \ BPepers_Temp \ Projects […]

什么能使程序第二次运行得更快?

当我testing编写代码时,我注意到的一点是,长时间运行的程序在运行程序的第一次运行时往往比在后续运行时运行时间要长,有时甚至超过10倍。 很明显,这里有一些冷caching/热caching的问题,但我似乎无法弄清楚它是什么。 这不是CPUcaching,因为这些长时间运行的操作往往是循环,我提供了大量的数据,并且应该在第一次迭代之后完全加载。 (另外,卸载和重新加载程序应该清除caching。) 另外,它不是光盘caching。 我已经通过从光盘上加载所有数据并在之后处理来排除这种情况,这是实际的CPU数据处理过程缓慢的原因。 那么什么事情会导致我的程序在第一次运行时运行缓慢,但是如果closures它并再次运行它,运行速度会更快吗? 我已经在几个不同的程序中看到了这一点,它们做了很多不同的事情,所以这似乎是一个普遍的问题。 编辑:澄清,我在Delphi写,但我真的不认为这是一个Delphi特定的问题。 但是这意味着无论问题是什么,它都与JIT问题,垃圾收集问题或托pipe代码带来的任何其他包袱无关。 而我没有处理networking连接。 这是纯粹的CPU绑定处理。 一个例子:一个脚本编译器。 它像这样运行: 从光盘加载整个文件到内存中 将整个文件打包成一个标记队列 将队列parsing为树 在树上运行codegen来产生字节码 如果我把大量的脚本文件(~100K行)从光盘载入到内存中,lex步骤第一次运行需要大约15秒,而后续运行需要2秒。 (是的,我知道还有很长一段时间,我正在研究这个…)我想知道经济放缓是从哪里来的,我能做些什么。

.NET SqlConnection网卡使用情况

有一台计算机与多个网卡,我需要指定一个用于连接到SQL Server的。