Tag: 性能

Java的秒表类

你应该使用哪个Java类来进行时间性能测量? (可以使用任何date/时间类,但我要问的原因是.Net中有一个指定的秒表类用于此目的)

pow(int,int)为什么这么慢?

我一直在做一些Euler练习,以提高我对C ++的了解。 我写了下面的函数: int a = 0,b = 0,c = 0; for (a = 1; a <= SUMTOTAL; a++) { for (b = a+1; b <= SUMTOTAL-a; b++) { c = SUMTOTAL-(a+b); if (c == sqrt(pow(a,2)+pow(b,2)) && b < c) { std::cout << "a: " << a << " b: " << b << " […]

C#:为什么字典比列表快得多?

我正在testing从Dictionary VS列表中获取数据的速度。 我用这个代码来testing: internal class Program { private static void Main(string[] args) { var stopwatch = new Stopwatch(); List<Grade> grades = Grade.GetData().ToList(); List<Student> students = Student.GetStudents().ToList(); stopwatch.Start(); foreach (Student student in students) { student.Grade = grades.Single(x => x.StudentId == student.Id).Value; } stopwatch.Stop(); Console.WriteLine("Using list {0}", stopwatch.Elapsed); stopwatch.Reset(); students = Student.GetStudents().ToList(); stopwatch.Start(); Dictionary<Guid, string> dic = […]

为什么当我通过SFTP传输文件,比FTP花费更长的时间?

我手动将一个文件复制到一个服务器,并将其同一个到一个SFTP服务器。 该文件是140MB。 FTP:我有一个11MB /秒的速度 SFTP:我有一个4.5MB / s的速率 我知道文件在发送之前必须encryption。 这是对文件传输的唯一影响吗? (实际上这不是完全传输时间,而是encryption时间)。 我很惊讶这样的结果。

性能打击从C + +风格转换?

我是新来的C + +风格强制转换,我担心使用C ++风格强制转换会破坏我的应用程序的性能,因为我的中断服务程序中有一个实时关键的截止date 。 我听说有些演员甚至会抛出exception! 我想使用C ++风格强制转换,因为它会使我的代码更“健壮”。 但是, 如果有任何性能下降,那么我可能不会使用C ++风格的转换,而是花费更多的时间来testing使用C风格转换的代码。 有没有人做过任何严格的testing/分析来比较C ++风格演员的performance与C风格演员? 你的结果是什么? 你画什么结论?

加快在Python中将string配对成对象

我试图find一种有效的方法将包含整数点的数据行组合在一起,并将它们存储为Python对象。 数据由X和Y坐标点组成,用逗号分隔的string表示。 如(x_1, y_1), (x_2, y_2), …等等必须配对,然后存储为一个对象列表,其中每个点是一个对象。 下面的函数get_data生成这个示例数据: def get_data(N=100000, M=10): import random data = [] for n in range(N): pair = [[str(random.randint(1, 10)) for x in range(M)], [str(random.randint(1, 10)) for x in range(M)]] row = [",".join(pair[0]), ",".join(pair[1])] data.append(row) return data 我现在的parsing代码是: class Point: def __init__(self, a, b): self.a = a self.b = b def […]

为什么是std :: vector :: operator 比std :: vector :: at()快5到10倍?

在程序优化期间,试图优化循环遍历一个向量,我发现以下事实::: std :: vector :: at()比operator []要慢得多! 在释放和debugging版本(VS2008 x86)中,运算符[]比()的速度快5到10倍 。 在网上阅读让我意识到在()有边界检查。 好的,但是,放慢操作达10倍?! 这有什么理由吗? 我的意思是,边界检查是一个简单的数字比较,还是我错过了什么? 问题是这个性能打击的真正原因是什么? 还有, 有什么办法可以让它更快 ? 我当然会在其他代码部分(我已经有自定义的边界检查!)与[]调用我所有的()调用。 概念validation: #define _WIN32_WINNT 0x0400 #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <conio.h> #include <vector> #define ELEMENTS_IN_VECTOR 1000000 int main() { __int64 freq, start, end, diff_Result; if(!::QueryPerformanceFrequency((LARGE_INTEGER*)&freq)) throw "Not supported!"; freq /= 1000000; // microseconds! ::std::vector<int> vec; vec.reserve(ELEMENTS_IN_VECTOR); for(int […]

为什么putImageData这么慢?

我正在用各种(复杂)的东西绘制到一个相对较大的canvas。 然后我想保存Canvas的状态,这样我就可以快速地将它重置到现在的状态。 我为此使用getImageData并将数据存储在variables中。 然后,我将更多的东西画到canvas上,然后使用putImageData将Canvas重置到它保存状态的位置。 但是,事实certificate,putImageData是非常缓慢的。 事实上,它比从头开始重绘整个Canvas要慢很多,这涉及几个drawImage覆盖大部分曲面,以及超过40.000个lineTo操作,随后是中风和填充。 重新绘制约2000 x 5000像素的canvas从头开始需要约170毫秒,使用putImageData虽然需要高达240ms。 为什么putImageData与重绘canvas相比如此之慢,尽pipe重画canvas包括用drawImage填充几乎整个canvas,然后用lineTo,stroke和fill再次填充大约50%的canvas。 所以基本上每个像素在重绘时至less触摸一次。 因为drawImage似乎比putImageData快得多(毕竟,重绘canvas的drawImage部分less于30毫秒)。 我决定尝试保存canvas的状态,而不是使用getImageData,而是使用canvas.toDataURL,然后从数据URL中创build一个图像,然后将其放入drawImage中以将其绘制到canvas上。 原来这整个过程更快,只需要大约35毫秒来完成。 那么,为什么putImageData比替代方法(使用getDataURL或简单地重绘)慢得多? 我怎么能进一步加快速度? 是否有,如果一般来说最好的方式来存储canvas的状态? (所有的数字都使用Firefox内的Firebug进行测量)

为什么Swift在这个image processingtesting中比C慢100倍?

和许多其他开发者一样,我对于苹果的新Swift语言感到非常兴奋。 苹果宣称其速度比Objective C更快,可用于编写操作系统。 从我迄今为止所了解到的情况来看,这是一种静态types语言,能够精确控制确切的数据types(如整数长度)。 所以它看起来像具有良好的潜在处理性能的关键任务,如image processing,对吗? 这是我进行快速testing之前的想法。 结果真的让我很吃惊。 这里是一个简单的C代码片段: test.c的: #include <stdio.h> #include <stdint.h> #include <string.h> uint8_t pixels[640*480]; uint8_t alpha[640*480]; uint8_t blended[640*480]; void blend(uint8_t* px, uint8_t* al, uint8_t* result, int size) { for(int i=0; i<size; i++) { result[i] = (uint8_t)(((uint16_t)px[i]) *al[i] /255); } } int main(void) { memset(pixels, 128, 640*480); memset(alpha, 128, 640*480); memset(blended, 255, […]

如何在Haskell中获得5GB堆的控制权?

目前我正在试验用Snap编写的一个Haskellnetworking服务器,它加载并提供给客户大量的数据。 而且我非常非常难以控制服务器进程。 在随机的时刻,这个过程使用了大量的CPU几分钟到几分钟,并且对客户端请求没有反应。 有时内存使用会在几秒钟内高峰(有时会下降)数百兆字节。 希望有人对长时间运行的Haskell进程有更多的经验,这些进程使用大量的内存,并且可以给我一些指针来使事情更稳定。 我已经debugging了好几天了,现在我开始有点绝望了。 我的设置一点点概述: 在服务器启动时,我将大约5千兆字节的数据读入内存中的大(嵌套)Data.Map-like结构。 嵌套地图的值是严格的,地图中的所有值都是数据types,所有的字段也都是严格的。 我花了很多时间确保没有未经评估的thunk被留下。 导入(取决于我的系统负载)大约需要5-30分钟。 奇怪的是连续运行的波动比我想象的要大得多,但这是一个不同的问题。 大数据结构位于由Snap服务器产生的所有客户端线程共享的“TVar”内。 客户可以使用小型查询语言来请求数据的任意部分。 数据请求量通常很小(高达300kb左右),只能触及数据结构的一小部分。 所有只读请求都使用“readTVarIO”来完成,所以它们不需要任何STM事务。 服务器使用以下标志启动:+ RTS -N -I0 -qg -qb。 这将以multithreading模式启动服务器,禁用空闲时间和并行GC。 这似乎加快了这个过程。 服务器大多运行没有任何问题。 然而,客户端请求每隔一段时间就会超时,CPU高达100%(甚至超过100%),并持续很长一段时间。 同时服务器不再响应请求。 我能想到的几个原因可能会导致CPU使用率: 这个请求需要花费很多时间,因为有很多工作要做。 这是不太可能的,因为有时会发生在以前的运行中已经certificate是非常快的请求(我的意思是20-80ms左右)。 在数据被处理和发送给客户端之前,仍然有一些未被评估的thunk需要被计算。 这也是不太可能的,与前面的观点一样。 不知何故垃圾收集踢,并开始扫描我的整个5GB的堆。 我可以想象这会花费很多时间。 问题是,我不知道如何弄清楚到底发生了什么,该怎么办。 由于导入过程需要很长时间,因此分析结果不会显示任何有用的信息。 似乎没有办法有条件地打开和closures代码内的分析器。 我个人认为GC是这里的问题。 我正在使用GHC7,似乎有很多选项来调整GC的工作方式。 通常非常稳定的数据使用大堆时,您推荐什么样的GC设置?