在分析我的应用程序(C#、.NET4)时,我注意到我正在使用的第三方库显式调用了GC.Collect()。这非常烦人,因为它有时会对我的应用程序性能产生巨大影响,因为对该库的一些调用最终会陷入巨大的循环:花在GC.Collect上的时间占总执行时间的80%以上。当然,我向库维护者报告了这种行为(库不是开源的),但是当他们正在开发新版本时,我想优化我的应用程序。我能做什么?我尝试通过将GCSettings.LatencyMode设置为GCLatencyMode.LowLatency来配置GC(当然,仅在执行库调用期间),但无济于事。我宁愿避免fork我的过程。有什么想法吗?
如果我使用publicintI;(或任何其他字段)创建一个类,与创建一个继承自具有publicint的基类的类相比,编译器是否会生成相同的IL我;?无论哪种方式,生成的类的行为都相同,但编译器的行为是否相同?也就是说,编译器只是将代码从基类复制粘贴到派生类中,还是在您继承时实际上创建了两个不同的类对象?classA{publicintI;}classB:A{}现在,以下两个DoSomething()调用之间是否存在任何性能差异?vara=newA();varb=newB();DoSomething(a.I);DoSomething(b.I);//Isthislineslowerthan
我试图比较在C#中将委托(delegate)传递给函数的三种不同方式——通过lambda、通过委托(delegate)和通过直接引用。真正让我吃惊的是直接引用方法(即ComputeStringFunctionViaFunc(object[i].ToString))比其他方法慢六倍。有谁知道这是为什么吗?完整代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.CompilerServices;namespaceFunctionInvoc
我一直在做其他实验,直到这种奇怪的行为引起了我的注意。代码在x64版本中编译。如果键入1,List方法的第3次运行比前2次多花费40%的时间。输出是Listcosts9312Listcosts9289Arraycosts12730Listcosts11950如果键入2,Array方法的第3次运行比前2次多花费30%的时间。输出是Arraycosts8082Arraycosts8086Listcosts11937Arraycosts12698可以看到模式,完整的代码附在下面(编译运行即可):{提供的代码对于运行测试来说是最少的。用于获得可靠结果的实际代码更复杂,我包装了该方法并在适当预热
我正在运行一个程序来衡量在包含大量文件的文件夹中查找和迭代所有文件的速度。该过程中最慢的部分是创建超过100万个文件。我目前正在使用一种非常天真的方法来创建文件:Console.Write("Creating{0:N0}file(s)ofsize{1:N0}bytes...",options.FileCount,options.FileSize);varcreateTimer=Stopwatch.StartNew();varfileNames=newList();for(longi=0;i输出:Creating1,000,000file(s)ofsize0bytes...Done.Ti
在研究如何将NameValueCollection转换为查询字符串时,我遇到了不同的方法。我很好奇更短的lambda语法是否尽可能高效。HowtoconvertNameValueCollectiontoa(Query)String使用迭代函数。publicstaticStringConstructQueryString(NameValueCollectionparameters){Listitems=newList();foreach(Stringnameinparameters)items.Add(String.Concat(name,"=",System.Web.HttpUtili
我经常发现,如果我在Linq查询中有太多连接(无论是使用EntityFramework还是NHibernate)和/或生成的匿名类的形状太复杂,Linq需要很长时间才能实现结果设置为对象。这是一个一般性问题,但这里有一个使用NHibernate的具体示例:varlibraryBookIdsWithShelfAndBookTagQuery=(fromshelfinsession.Query()joinsbttrefinsession.Query()onshelf.ShelfIdequalssbttref.ShelfIdjoinbookTaginsession.Query()onsbttr
我在内存中有一个很大的List,来自一个具有大约20个properties的类。我想仅根据一个property过滤此列表,对于特定任务我只需要该property的列表。所以我的查询是这样的:data.Select(x=>x.field).Where(x=>x=="desiredvalue").ToList()先使用Select还是使用Where哪个性能更好?data.Where(x=>x.field=="desiredvalue").Select(x=>x.field).ToList()如果这与我将数据保存在内存中的数据类型或字段类型有关,请告诉我。请注意,我也需要这些对象来执行其他任
我需要从文本文件中删除某一行。最有效的方法是什么?文件可能很大(超过百万条记录)。更新:下面是我目前使用的代码,但我不确定它是否好。internalvoidDeleteMarkedEntries(){stringtempPath=Path.GetTempFileName();using(varreader=newStreamReader(logPath)){using(varwriter=newStreamWriter(File.OpenWrite(tempPath))){intcounter=0;while(!reader.EndOfStream){if(!_deletedLines
我有一个关于在没有抛出异常的情况下使用异常处理的效率后果的假设性问题。首先看一下这个C#:intsimpleSimon,cautiousCarol,dangerousDave;try{simpleSimon=int.Parse("fail");}catch{simpleSimon=1;}try{cautiousCarol=int.Parse("1");}catch{cautiousCarol=1;}dangerousDave=int.Parse("1");我相信Dave的代码将是最快/最有效的;而Simon将因抛出异常而受到很大的惩罚。但是卡罗尔呢?由于她没有抛出异常,她会受到惩罚吗?