Articles of 性能

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

当我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的。

使用BinaryReader读取大文件(> 1 GB)时,最佳缓冲区大小是多less?

我正在阅读二进制文件,这里是一个示例: public static byte[] ReadFully(Stream input) { byte[] buffer = new byte[16*1024]; int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { …… } } 缓冲区大小(16 * 1024)显然对性能有很大的作用。 我已经读过,它取决于I / O技术( SATA , SSD , SCSI等)以及其上存在的分区的分段大小(我们可以在格式化分区时定义)。 但是这里有一个问题: 是否有任何公式或最佳实践来定义缓冲区大小? 现在,我正在基于反复试验来定义。 编辑:我testing了我的服务器上的应用程序与不同的缓冲区大小,我得到了4095 * 256 * 16(16 MB)的最佳性能! 4096慢了4秒。 这里有一些旧post是非常有帮助的,但我仍然不能得到原因: .NET中更快(不安全)的BinaryReader 最佳文件缓冲区读取大小? 文件I / O与stream – 最佳的内存缓冲区大小 […]

我怎么能故意拖慢Windows?

我如何可逆地减慢PC与XP? 我想实现这一点,而不使用可见的CPU周期,所以我猜一些硬件设置可能会做。 我不希望我的应用程序运行缓慢,我希望整个操作系统缓慢。 我知道一些networking查找,特别是在一个可信的环境下(比如Active Directory),可以减慢PC的速度。 这是我想要的效果。 免责声明:这不是一个坏的/邪恶的/非法的事业!

Windows中进程的最短保证时间是多less?

我有一个进程提供一个具有特定缓冲区大小的硬件(数据传输设备)。 我可以从Windows调度程序窗口合理的期望,以确保我没有得到一个缓冲区下溢? 我的缓冲区大小为32K,以〜800k字节/秒的速度消耗。 如果我填写16k字节的批量,每20ms一个批量。 但是,我填充的下限是多less? 如果说,我在填充循环中调用sleep(0),那么我最合适的最坏情况调度间隔是多less? OS = Windows XP SP3双核2.2Ghz 请注意,我正在进行API调用以检查缓冲区填充级别以及对驱动程序API的调用以将其传递给数据。 我假设这些是Windows除了睡眠(0)之外可以使用的调度点。 我想(作为一个过程)performance出色,仍然能够实现我的实时期限。 机器专门负责此任务,但需要通过networking接收数据并将其发送到IO设备。 我对调度程序的性能有什么期望? 还有什么我需要考虑。

开发版本中与OutputDebugString相关联的开销

在发布版本中调用OutputDebugString是否有相当大的开销?

Windows fsync(FlushFileBuffers)性能与大文件

从确保数据在磁盘上的信息( http://winntfs.com/2012/11/29/windows-write-caching-part-2-an-overview-for-application-developers/ ),甚至在例如停电,看起来在Windows平台上,您需要依靠其“fsync”版本FlushFileBuffers来最好地保证缓冲区实际上从磁盘设备caching刷新到存储介质本身。 FILE_FLAG_NO_BUFFERING与FILE_FLAG_WRITE_THROUGH的组合不能确保刷新设备高速caching,而只是对文件系统高速caching产生影响(如果此信息正确)。 鉴于我将处理相当大的文件,需要更新“事务”,这意味着在事务提交结束时执行“fsync”。 所以我创build了一个小应用程序来testing这样做的performance。 它基本上使用8次写入来执行一批8个内存页大小的随机字节的顺序写入,然后刷新。 批处理循环重复,每写完这么多页面,它就会logging下性能。 另外它有两个可configuration的选项:fsync在flush上,以及是否在开始页面写入之前写一个字节到文件的最后位置。 // Code updated to reflect new results as discussed in answer below. // 26/Aug/2013: Code updated again to reflect results as discussed in follow up question. // 28/Aug/2012: Increased file stream buffer to ensure 8 page flushes. class Program { static void Main(string[] args) { BenchSequentialWrites(reuseExistingFile:false); […]

调用Runtime.getRuntime()。availableProcessors()

我试图在运行程序时检查系统的性能 我参考这篇文章获取操作系统级别的系统信息 当这个Runtime.getRuntime().availableProcessors(); 执行我得到了答案4 我读了availableProcessors(),但它告诉这个方法返回处理器的数量 任何人都可以解释处理器的数量是什么意思? 为什么会得到4结果? 我正在使用Windows 7核心i5 4gp。 非常感谢你

转换旧的Windows基础应用程序(与狐狸亲)到Web基础应用程序(与C#csharp的asp.net) – 需要哪些技术(阿贾克斯等)?

我的编程语言是asp.net与C#… 我正在寻找一个最好的和最快速的方式来转换一个旧的Windows基础应用程序(与狐狸亲)到基地应用程序(与asp.net和C#)… 在这种情况下,input数据的速度对用户来说非常重要。 我应该为此使用哪种技术? 我知道ajax(更新面板或RadAjaxManager),是否足够做这个,或者我应该学习其他技术? 看起来这个网站在ajax模式下有很好的评价(比如评论,投票等)是否可以告诉我们? 在我国,用户的最大带宽是:1mbps 提前致谢 /最好的祝福/

高效地获取Windows桌面的屏幕截图

有没有比下面的代码更有效的方式获得Windows桌面(使用GDI或任何其他库)的副本 HDC dcDesktop; HDC dcMem; HBITMAP hbmpMem; HBITMAP hOriginal; BITMAP bmpDesktopCopy; dcDesktop = GetDC( GetDesktopWindow() ); dcMem = CreateCompatibleDC( dcDesktop ); hbmpMem = CreateCompatibleBitmap( dcMem, m_lWidth, m_lHeight ); BitBlt( dcMem, 0, 0, m_lWidth, m_lHeight, dcDesktop, 0, 0, SRCCOPY ); // Copy the hbmpMem to the desktop copy GetObject(hbmpMem, sizeof(BITMAP), (LPSTR)&bmpDesktopCopy);