Tag: performance

将对象转换为双倍的最快方法?

将对象转换为double的最快方法是什么? 我现在正处于一段代码中,其中包括: var d = double.TryParse(o.ToString(), out d); // o is the Object… 首先想到的是将其重写为 var d = Convert.ToDouble(o); 但实际上会更快吗? 编辑:除了运行配置文件(顺便说一下,我强烈建议任何开发人员使用JetBrains dotTrace ),我运行了Reflector,这帮助我提出了以下内容(或多或少相关的代码部分): if (o is IConvertible) { d = ((IConvertible)o).ToDouble(null); } else { d = 0d; } 原始代码double.TryParse()在140ms内执行。 新代码在34ms内执行。 我几乎可以肯定这是我应该采取的优化路径,但在我这样做之前,有没有人看到我的“优化”代码存在任何问题? 在此先感谢您的反馈!

在关注性能时,使用DateTime.Today的变量有多重要?

我刚看到这个赞成的评论 IIRC DateTime.Today是一个非常昂贵的调用,因此您最好先将值存储在变量中。 这是对包含代码的post的回应: var first = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(-1); var last = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddDays(-1); 如果我希望提高性能,将DateTime.Today存储在变量中而不是多次调用它有多重要? 大致有多少使用DateTime.Today可以certificate为它创建一个变量? 编辑:我意识到我应该测试我的程序,看看是否存在性能问题,然后再担心像这样微不足道的事情。 为了这个问题,假设我已经这样做并确定需要进行额外的优化。

在C#中使用内存映射文件时是否可以避免数据副本?

我对内存映射文件如何在C#中工作的理解是每个数据请求都会产生一个副本。 例如,如果您将大型数据结构保留为文件,则使用内存映射文件将导致映射到RAM的实际文件的内存,以及从文件读取后驻留在GC堆中的副本。 我假设这是因为指针和GC一般来说并不能很好地相处。 那么,有什么方法可以解决这个问题吗? 也许通过一些混合模式C ++可以通过内存映射数据公开托管API? 用不安全的C#直接指针操作怎么样? 我试图解决的一般问题是在多个进程之间共享一个大型数据结构。 数据结构用于回答一小部分“问题”,这些问题可以作为一个简单的API公开(即基本上是一堆其他数据的高度专业化的索引)。 另外,这不会使.NET API对“共享大量数据”场景无用吗?

如何监控特定应用程序的网络带宽使用情况?

我正在尝试学习如何监视特定应用程序的网络带宽使用情况。 我正在看IPv4InterfaceStatistics ,但这似乎监控了NIC卡的性能。 我想监视一个特定的应用程序,看看每秒消耗多少带宽。 有谁知道如何做到这一点的例子?

如何更新LINQ中的单个列而不加载整行?

在LinqToSql中,加载行,更改列以及将更改提交到数据库非常容易: using (MyDataContext wdc = new MyDataContext()) { Article article = wdc.Article.First(p => p.ID == id); article.ItemsInStock = itemsinstock; wdc.SubmitChanges(); } 唯一的缺点:文章很大。 要加载整篇文章,只是为了更新一个列是过度杀戮并显着减慢我的应用程序。 有没有办法使用LINQ更新单个列,而无需加载整行? 现在我恢复使用ExecuteCommand,其中速度至关重要,但这很丑陋且容易出错: wdc.ExecuteCommand(“UPDATE Article SET ItemsInStock = @1 WHERE ID = @2”, itemsinstock,id);

C#事件:如何以并行方式处理事件

我有一个我希望以并行方式处理的事件。 我的想法是将每个回调添加到ThreadPool,effectivley有每个注册由ThreadPool处理的事件的方法。 我的试用代码如下所示: Delegate[] delegates = myEvent.GetInvocationList(); IAsyncResult[] results = new IAsyncResult[ delegates.Count() ]; for ( int i = 0; i < delegates.Count(); i++ ) { IAsyncResult result = ( ( TestDelegate )delegates[ i ] ).BeginInvoke( “BeginInvoke/EndInvoke”, null, null ); results[ i ] = result; } for ( int i = 0; i < delegates.Length; […]

为什么在取消大量HTTP请求时取消会阻塞这么长时间?

背景 我有一些代码使用来自一个特定主机的内容执行批量HTML页面处理。 它尝试使用HttpClient创建大量(~400)的同步HTTP请求。 我相信ServicePointManager.DefaultConnectionLimit限制了最大并发连接数,所以我没有应用自己的并发限制。 使用Task.WhenAll将所有请求异步发送到HttpClient Task.WhenAll ,可以使用CancellationTokenSource和CancellationToken取消整个批处理操作。 可以通过用户界面查看操作的进度,并且可以单击按钮以执行取消。 问题 对CancellationTokenSource.Cancel()的调用会阻塞大约5到30秒。 这会导致用户界面冻结。 怀疑是因为该方法正在调用注册取消通知的代码。 我考虑过什么 限制同时HTTP请求任务的数量。 我认为这是一种解决方法,因为HttpClient似乎已经HttpClient了过多的请求本身。 在非UI线程中执行CancellationTokenSource.Cancel()方法调用。 这不太好用; 在大多数其他任务完成之前,任务实际上并未运行。 我认为该方法的async版本可以很好地工作,但我找不到一个。 另外,我的印象是它适合在UI线程中使用该方法。 示范 码 class Program { private const int desiredNumberOfConnections = 418; static void Main(string[] args) { ManyHttpRequestsTest().Wait(); Console.WriteLine(“Finished.”); Console.ReadKey(); } private static async Task ManyHttpRequestsTest() { using (var client = new HttpClient()) using (var cancellationTokenSource […]

结构的快速序列化/反序列化

我有大量的地理数据表示在简单的对象结构中,只包含结构。 我的所有字段都是有价值的类型。 public struct Child { readonly float X; readonly float Y; readonly int myField; } public struct Parent { readonly int id; readonly int field1; readonly int field2; readonly Child[] children; } 数据很好地分配给Parent[] -s的一小部分。 每个数组包含几千个父实例。 我有太多的数据来保存所有内存,所以我需要来回交换这些块到磁盘。 (一个文件大约2-300KB)。 对于dumpint到磁盘并回读,将Parent[]序列化/反序列化为byte[]的最有效方法是什么? 关于速度, 我对快速反序列化特别感兴趣 ,写入速度并不是那么关键。 简单的BinarySerializer会不够好? 或者我应该使用StructLayout (参见接受的答案) ? 我不确定这是否适用于Parent.children数组字段。 更新:对注释的响应 – 是的,对象是不可变的(代码更新),并且children字段实际上不是值类型。 300KB听起来并不多,但我有数以万计的文件,所以速度确实很重要。

如何加速DbSet.Add()?

我必须从CSV文件导入大约30k行到我的SQL数据库,这可能需要20分钟。 使用分析器进行故障排除向我显示DbSet.Add占用的时间最多,但为什么呢? 我有这些Entity Framework Code-First类: public class Article { // About 20 properties, each property doesn’t store excessive amounts of data } public class Database : DbContext { public DbSet Articles { get; set; } } 对于我的for循环中的每个项目,我做: db.Articles.Add(article); 在for循环之外我做: db.SaveChanges(); 它与我的本地SQLExpress服务器连接,但我想在SaveChanges被调用之前没有任何东西,所以我猜服务器不会出现问题….

为什么C#编译器在使用LINQ方法时会创建私有DisplayClass Any()以及如何避免它?

我有这个代码(整个代码并不重要,但可以在这个链接上看到): internal static class PlayCardActionValidator { public static bool CanPlayCard(…) { // … var hasBigger = playerCards.Any( c => c.Suit == otherPlayerCard.Suit && c.GetValue() > otherPlayerCard.GetValue()); // … } } 例如,在反编译器(ILSpy)中打开代码之后,我注意到C#编译器存在新创建的类c__DisplayClass0_0 : 如果此代码对系统性能不重要,对我来说这不是问题。 这个方法被调用数百万次,垃圾收集器正在清理这些c__DisplayClass0_0实例,这会降低性能: 在使用Any方法时,如何避免创建此类(他的实例和垃圾收集)? 为什么C#编译器创建这个类,我可以使用任何替代的Any()吗?