什么是从Java中的String中去除所有不可打印字符的最快方法? 到目前为止,我已经尝试和测量了138字节,131字符的string: String的replaceAll() – 最慢的方法 517009结果/秒 预编译模式,然后使用匹配器的replaceAll() 637836结果/秒 使用StringBuffer,使用codepointAt()逐个获取代码codepointAt()并追加到StringBuffer 711946结果/秒 使用StringBuffer,使用charAt()逐个获取字符并追加到StringBuffer 1052964结果/秒 预先分配一个char[]缓冲区,使用charAt()逐个获取字符并填充此缓冲区,然后转换回string 2022653结果/秒 预先分配2个char[]缓冲区 – 旧的和新的,使用getChars()立即获取现有string的所有字符, getChars()迭代旧缓冲区并填充新缓冲区,然后将新缓冲区转换为string – 我自己的最快版本 每秒2502502个结果 与2缓冲区相同的东西 – 只使用byte[] , getBytes()和指定编码为“utf-8” 857485结果/秒 与2 byte[]缓冲区相同的东西,但指定编码作为一个常量Charset.forName("utf-8") 791076结果/秒 与2 byte[]缓冲区相同的东西,但指定编码为1字节的本地编码(只是一个理智的事情) 370164结果/秒 我最好的尝试是以下几点: char[] oldChars = new char[s.length()]; s.getChars(0, s.length(), oldChars, 0); char[] newChars = new char[s.length()]; int newLen = 0; for (int j […]
我发现!=和==不是testing零或非零的最快方法。 bool nonZero1 = integer != 0; xor eax, eax test ecx, ecx setne al bool nonZero2 = integer < 0 || integer > 0; test ecx, ecx setne al bool zero1 = integer == 0; xor eax, eax test ecx, ecx sete al bool zero2 = !(integer < 0 || integer > 0); test […]
什么是测量angularjs摘要周期持续时间的简单方法? 有各种方法来分析摘要循环的性能,但是每个都有自己的坑: Chrome Profiler:太多的细节,并没有以简单易懂的方式打破文摘循环 Batarang(AngularJS浏览器插件):开销太大,刷新速度慢,大应用程序爆炸。 …一定有更好的办法?!1?
可能重复: 如何在Java中计算方法的执行时间? 我写了一个程序,现在我想计算我的程序从开始到结束的总运行时间。 我怎样才能做到这一点?
我不知道其他人是否有与Visual Studio 2010的性能问题,但我每天closures它,并重新打开它,一个小时,它开始真正陷入困境,甚至不能跟上我的打字。 有没有一些明显的设置,我失踪,这将有助于加快? 我也使用ReSharper,但即使我删除了它,它只是稍微提高速度。 由于有几个人要求我的机器规格: Intel Q9550 @ 2.83 GHz 4 Cores 8GB Physical RAM 2x 60GB SSD in RAID0 combination for solution/project VS2010 RTM Ultimate Windows Server 2008 x64 R2 (Performance set for Applications) 虽然听到这个答案是“买更快的硬件”,但是我的硬件实际上还不错的时候很遗憾。 编辑:包括由TimothyPbuild议的Visual Studio性能诊断工具的链接
我正在调查一个应用程序中的性能热点,这个应用程序在memmove(3)中花费了50%的时间。 应用程序将数百万个4字节的整数插入到已sorting的数组中,并使用memmove将数据“向右移动”,以便为插入值腾出空间。 我的期望是复制记忆速度非常快,我惊讶于花费了太多的时间。 但是后来我有一个想法,就是memmove很慢,因为它正在移动重叠的区域,必须在严格的循环中执行,而不是复制大量的内存。 我写了一个小的微型基准来看看memcpy和memmove之间是否存在性能差异,希望memcpy赢得双手。 我在两台机器(核心i5,核心i7)上运行我的基准testing,看到memmove实际上比memcpy更快,在旧的核心i7上甚至快了近一倍! 现在我正在寻找解释。 这是我的基准。 它用memcpy复制100 MB,然后用memmove移动大约100 MB。 来源和目的地重叠。 尝试了源和目的地的各种“距离”。 每个testing运行10次,平均时间打印。 https://gist.github.com/cruppstahl/78a57cdf937bca3d062c 以下是Core i5(Linux 3.5.0-54-generic#81〜precise1-Ubuntu SMP x86_64 GNU / Linux,gcc是4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)的结果。括号内的数字是源和目标之间的距离(间隙大小): memcpy 0.0140074 memmove (002) 0.0106168 memmove (004) 0.01065 memmove (008) 0.0107917 memmove (016) 0.0107319 memmove (032) 0.0106724 memmove (064) 0.0106821 memmove (128) 0.0110633 Memmove是作为SSE优化的汇编代码实现的,从后向前复制。 它使用硬件预取将数据加载到caching中,并将128个字节复制到XMM寄存器,然后将其存储在目标处。 ( memcpy-ssse3-back.S ,第1650行ff) L(gobble_ll_loop): […]
我试图衡量在访问值types和引用types列表时使用for和foreach的区别。 我使用下面的类来进行分析。 public static class Benchmarker { public static void Profile(string description, int iterations, Action func) { Console.Write(description); // Warm up func(); Stopwatch watch = new Stopwatch(); // Clean up GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); watch.Start(); for (int i = 0; i < iterations; i++) { func(); } watch.Stop(); Console.WriteLine(" average time: {0} ms", watch.Elapsed.TotalMilliseconds / iterations); […]
我从一个模拟(用Fortran编写)得到一个表示温度分布的512 ^ 3数组。 该数组存储在大小约为1 / 2G的二进制文件中。 我需要知道这个数组的最小值,最大值和平均值,因为无论如何,我将很快需要了解Fortran代码,所以我决定给它一个提示,并提出以下非常简单的例程。 integer gridsize,unit,j real mini,maxi double precision mean gridsize=512 unit=40 open(unit=unit,file='T.out',status='old',access='stream',& form='unformatted',action='read') read(unit=unit) tmp mini=tmp maxi=tmp mean=tmp do j=2,gridsize**3 read(unit=unit) tmp if(tmp>maxi)then maxi=tmp elseif(tmp<mini)then mini=tmp end if mean=mean+tmp end do mean=mean/gridsize**3 close(unit=unit) 这在我使用的机器上每个文件需要约25秒。 这让我感到相当长,所以我继续前进,在Python中做了以下事情: import numpy mmap=numpy.memmap('T.out',dtype='float32',mode='r',offset=4,\ shape=(512,512,512),order='F') mini=numpy.amin(mmap) maxi=numpy.amax(mmap) mean=numpy.mean(mmap) 现在,我认为这当然会更快,但是我真的被吹走了。 在相同的条件下需要不到一秒的时间。 平均数偏离我的Fortran例程发现的数据(我也用128位浮点数运行,所以我以某种方式相信它),但是仅在第7位有效数字左右。 numpy怎么能这么快? 我的意思是你必须看看数组的每一个条目来find这些值,对吧? 我在Fortran程序中做了一些非常愚蠢的事情,因为它需要更长的时间? 编辑: 要回答评论中的问题: […]
我想在我的应用程序中实现日志logging,但宁愿不使用任何外部框架,如log4net。 所以我想做一些像DOS的回应文件。 什么是最有效的方法呢? 有没有办法login未经处理的exceptionlogging而不使用外部框架?
我目前有一个页面,声明如下: public partial class MyPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //snip MyButton.Click += (o, i) => { //snip } } } 我只是最近才从1.1版本移植到.NET 3.5,所以我习惯于在Page_Load之外编写事件处理程序。 我的问题是 是否有任何性能缺陷或缺陷,我应该留意当使用lambda方法呢? 我更喜欢它,因为它确实更简洁,但我不想牺牲性能来使用它。 谢谢。