Tag: performance

读取内存中的整个文件VS读取块

我对C#和编程比较陌生,所以请耐心等待。 我正在开发一个应用程序,我需要读取一些文件并以块的forms处理这些文件(例如,数据以48字节的块为单位处理)。 我想知道什么是更好的,性能方面的,在内存中一次读取整个文件然后处理它或以块的forms读取文件并直接处理它们或以更大的块读取数据(多个数据块是然后处理)。 到目前为止我如何理解事物: 读取内存中的整个文件 优点: – 它很快,因为最昂贵的操作是寻求,一旦头部就位,它可以读得非常快 缺点: – 它耗费了大量的内存 – 它在很短的时间内消耗了大量内存(这是我主要害怕的,因为我不希望它明显影响整体系统性能) 以块的forms读取文件 优点: – 实施起来更容易(更直观) while(numberOfBytes2Read > 0) read n bytes process read data – 消耗很少的内存 缺点: – 如果磁盘必须再次寻找文件并将磁头移动到适当的位置,这可能需要更多的时间,平均成本约为12毫秒。 我知道答案取决于文件大小(和硬件)。 我认为最好一次读取整个文件,但是对于大文件是多少这样, 一次在内存中读取的最大建议大小是多少(以字节为单位或相对于硬件 – 例如RAM的百分比)? 谢谢你的答案和时间。

使用StackExchange.Redis并行执行?

我在List有一个1M项目存储,我要序列化以便插入Redis。 (2.8) 我将工作分成10 Tasks ,其中每个Tasks都有自己的部分( List是readonly的线程安全 ( 在List上执行多个读操作是安全的 ) 简化: 例: 对于ITEMS=100 , THREADS=10 ,每个Task将捕获其自己的PAGE并处理相关范围。 对于exaple: void Main() { var ITEMS=100; var THREADS=10; var PAGE=4; List lst = Enumerable.Range(0,ITEMS).ToList(); for (int i=0;i< ITEMS/THREADS ;i++) { lst[PAGE*(ITEMS/THREADS)+i].Dump(); } } PAGE=0将处理: 0,1,2,3,4,5,6,7,8,9 PAGE=4将处理: 40,41,42,43,44,45,46,47,48,49 一切都好。 现在回到SE.redis。 我想实现这种模式,所以我做了 🙁 ITEMS=1,000,000 ) 我的测试: (这是每秒检查的dbsize ): 如您所见,通过10个线程添加了1M记录。 现在,我不知道它是否很快但是,当我将ITEMS从1M改为10M – 事情变得非常缓慢并且我得到例外: […]

使用Parallel.For令人失望的性能

我试图通过使用Parallel.For来加快我的计算时间。 我有一个带有8个内核的英特尔酷睿i7 Q840 CPU,但与顺序for循环相比,我只能获得4的性能比。 这是否与Parallel.For一样好,或者可以调整方法调用以提高性能? 这是我的测试代码,顺序: var loops = 200; var perloop = 10000000; var sum = 0.0; for (var k = 0; k < loops; ++k) { var sumk = 0.0; for (var i = 0; i < perloop; ++i) sumk += (1.0 / i) * i; sum += sumk; } 并行: sum = […]

C#:虚拟函数调用甚至比委托调用更快?

我刚刚遇到一个代码设计问题。 说,我有一个“模板”方法,可以调用一些可能“改变”的函数。 直观的设计是遵循“模板设计模式”。 将更改函数定义为要在子类中重写的“虚拟”函数。 或者,我可以使用没有“虚拟”的委托function。 注入委托函数,以便它们也可以自定义。 最初,我认为第二种“委托”方式比“虚拟”方式更快,但是一些编码片段certificate它不正确。 在下面的代码中,第一个DoSomething方法遵循“模板模式”。 它调用虚方法IsTokenChar。 第二个DoSomthing方法不依赖于虚函数。 相反,它有一个传入代理。 在我的电脑中,第一个DoSomthing总是比第二个快。 结果如1645:1780。 “虚拟调用”是动态绑定,应该比直接委托调用更耗时,对吗? 但结果表明它不是。 有人可以解释一下吗? using System; using System.Diagnostics; class Foo { public virtual bool IsTokenChar(string word) { return String.IsNullOrEmpty(word); } // this is a template method public int DoSomething(string word) { int trueCount = 0; for (int i = 0; i < repeat; […]

Expression.Compile与Lambda的性能,直接与虚拟调用

我很好奇Expression.Compile与代码中的lambda表达式和直接方法使用方式的性能如何,以及直接方法调用与虚方法调用(伪代码): var foo = new Foo(); var iFoo = (IFoo)foo; foo.Bar(); iFoo.Bar(); (() => foo.Bar())(); (() => iFoo.Bar())(); Expression.Compile(foo, Foo.Bar)(); Expression.Compile(iFoo, IFoo.Bar)(); Expression.CompileToMethod(foo, Foo.Bar); Expression.CompileToMethod(iFoo, IFoo.Bar); MethodInfo.Invoke(foo, Foo.Bar); MethodInfo.Invoke(iFoo, IFoo.Bar);

如何提高MongoDB插入性能

结果: 如果您正在对容错的数据集进行操作,或者执行一次性过程,则可以进行validation,将WriteAcknowledge更改为Unacknowledged可以提供帮助。 此外,默认情况下,批量操作是IsOrdered,我不知道。 将此设置为False实际上会使操作批量执行,否则它将作为一个更新线程运行。 MongoDB 3.0 / WiredTiger / C#驱动程序 我有一个包含147,000,000个文档的集合,其中我每秒都会执行更新(希望如此)。 3000个文件。 以下是更新示例: “query” : { “_id” : BinData(0,”UKnZwG54kOpT4q9CVWbf4zvdU223lrE5w/uIzXZcObQiAAAA”) }, “updateobj” : { “$set” : { “b” : BinData(0,”D8u1Sk/fDES4IkipZzme7j2qJ4oWjlT3hvLiAilcIhU=”), “s” : true } } 这是一个典型的更新,我的要求是以每秒3000的速度插入。 不幸的是,这些花费的时间是原来的两倍,例如最后一次更新是针对1723个文档,并且需要1061毫秒。 该集合仅在_id上有索引,没有其他索引,并且该集合的平均文档大小为244字节,无上限。 服务器有64GB内存,12个线程。 插入性能非常好,收集尺寸较小,比如大约5000万,但是大约8000万之后真正开始下降。 可能是因为整套不在内存中? 数据库由RAID0 SSD支持,因此IO性能不应成为瓶颈,如果它应该在一开始就显示出来? 非常感谢一些指导,因为我相信MongoDB可以满足我的相当微薄的要求,而不是它使用的一些应用程序。数据库没有大量的读取率,因此Sharding不会改善问题,尽管可能我错了。 无论哪种方式,目前的插入率都不够好。 更新:这里只是查询的explain()… “queryPlanner” : { “plannerVersion” : 1, “namespace” : “Collection”, “indexFilterSet” […]

C#中“新”的性能成本?

在C#中,使用new关键字的性能成本是多少? 我特别提到了与游戏开发有关的问题,我知道在C ++中,每个更新周期都是新手,这是一个明确的禁忌。 这同样适用于C#吗? 我正在使用XNA并开发移动设备。 只是真的问一个优化问题。

如何在不锁定GUI的情况下将数千个项目添加到绑定集合中

我有一个设置,可能会有数千个项目(想想3000-5000)将被添加到绑定到某个可视界面的ObservableCollection 。 目前,添加它们的过程非常缓慢(大约4秒/ 1000项),当然GUI在此期间没有响应。 处理将多个项目一次移动到集合中而不用担心系统锁定的好方法是什么? 我看过DispatcherTimer但我不确定它是否会提供我需要的一切。 另一个问题 – 我是否可以采取一些措施来加速这些对象的创建,以便将它们添加到集合中并不需要很长时间? 目前我使用它们是这样的: Collection.Add(new Item())预先生成项目,在后台线程中,可能会减少添加它们所需的时间吗? 编辑:虚拟化是不可能的。 要求指定了WrapPanel外观,因此显示实际上是一个具有模板化ItemsPanel的ListBox Edit2:根据秒表,瓶颈实际上是将物品放入我的ObservableCollection 。 我会尝试更改该集合类型并自行通知,看看是否会大大加快它的速度。 编辑3:所以答案在一个地方 – 我通过创建一个inheritance自ObservableCollection的类来解决这个问题(在下面的帮助下)。 这个类做了两件事 – 公开了一次添加集合的方法,并添加了抑制CollectionChanged事件的能力。 通过这些更改,添加3000个项目所需的时间大约为.4秒(97%的改进)。 此链接详细说明了这些更改的实现。

LINQ中的聚合与总和性能

下面给出了三种不同的实现,即查找IEnumerable 源的总和,以及源具有10,000个整数所花费的时间。 source.Aggregate(0, (result, element) => result + element); 需要3毫秒 source.Sum(c => c); 需要12毫秒 source.Sum(); 需要1毫秒 我想知道为什么第二次实施比第一次实施贵四倍。 不应该与第三个实现相同。

在新AppDomain中建立的第一个WCF连接非常慢

我有一个我使用的库,它使用WCF调用http服务来获取设置。 通常,第一次调用需要约100毫秒,后续调用只需几毫秒。 但是我发现当我创建一个新的AppDomain时,来自该AppDomain的第一个WCF调用需要2.5秒。 有没有人解释或解决为什么在新的AppDomain中首次创建WCF频道需要这么长时间? 这些是基准测试结果(当在64位版本中没有附带调试器的情况下运行时),请注意第二组数字中的第一个连接如何延长25倍以上 Running in initial AppDomain First Connection: 92.5018 ms Second Connection: 2.6393 ms Running in new AppDomain First Connection: 2457.8653 ms Second Connection: 4.2627 ms 这不是一个完整的例子,但显示了我生成这些数字的大部分内容: class Program { static void Main(string[] args) { Console.WriteLine(“Running in initial AppDomain”); new DomainRunner().Run(); Console.WriteLine(); Console.WriteLine(“Running in new thread and AppDomain”); DomainRunner.RunInNewAppDomain(“test”); Console.ReadLine(); } } […]