Tag: 性能

为什么等待异步这么慢?

我终于得到了VS2012并得到了一个简单的演示,并努力检查异步的潜在性能提升并等待,但令我沮丧的是它更慢! 它可能我做错了,但也许你可以帮助我。 (我还添加了一个简单的Threaded解决方案,并且按预期运行得更快) 我的代码使用一个类来根据系统中的内核数量对数组求和(-1)我有4个内核,所以我看到了大约2倍的加速(2.5个线程)用于线程,但是减少了2倍的速度同样的事情,但使用async / await。 代码:(注意,您需要添加对System.Management的引用以使核心检测器工作) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Management; using System.Diagnostics; namespace AsyncSum { class Program { static string Results = “”; static void Main(string[] args) { Task t = Run(); t.Wait(); Console.WriteLine(Results); Console.ReadKey(); } static async Task Run() { Random random = […]

是否期望这种慢速WPF TextBlock性能?

我正在做一些基准测试,以确定我是否可以将WPF用于新产品。 然而,早期的表现结果令人失望。 我制作了一个快速的应用程序,它使用数据绑定每100毫秒在列表框内显示一堆随机文本,它占用了大约15%的CPU。 所以我创建了另一个跳过数据绑定/数据模板方案的快速应用程序,除了每100毫秒更新一个ListBox内的10个TextBlocks之外什么都不做(实际产品不需要100毫秒更新,更像是500毫秒最多,但是这是一个压力测试)。 我仍然看到大约5-10%的CPU使用率。 为什么这么高? 是因为所有的垃圾串吗? 这是不使用绑定的版本的XAML: 这是背后的代码: public partial class Window1 : Window { private int _count = 0; public Window1() { InitializeComponent(); } private void OnLoad(object sender, RoutedEventArgs e) { var t = new DispatcherTimer(TimeSpan.FromSeconds(0.1), DispatcherPriority.Normal, UpdateNumerics, Dispatcher); t.Start(); } private void UpdateNumerics(object sender, EventArgs e) { ++_count; foreach (object textBlock in […]

OrderedDictionary的复杂性是什么?

没有人说OrderedDictionary有两个元素副本,一个在散列表中,另一个在列表中,我无法在MSDN上找到OrderedList的复杂度测量。 谢谢

将锯齿状数组的值克隆到第二个数组的速度非常快?

我目前正在开发一个应用程序,负责计算锯齿状arrays的随机排列。 目前,应用程序中的大部分时间都花费在每次迭代中复制数组(总共100万次迭代)。 在我当前的系统上,整个过程需要50秒才能完成,其中39秒用于克隆arrays。 我的数组克隆例程如下: public static int[][] CopyArray(this int[][] source) { int[][] destination = new int[source.Length][]; // For each Row for (int y = 0; y < source.Length; y++) { // Initialize Array destination[y] = new int[source[y].Length]; // For each Column for (int x = 0; x < destination[y].Length; x++) { destination[y][x] = source[y][x]; } […]

计算整数小数长度的最快方法? (。净)

我有一些代码可以对64位整数进行大量的比较,但是它必须考虑数字的长度,就像它被格式化为字符串一样。 我无法更改调用代码,只能更改函数。 最简单的方法(除了.ToString()。Length)是: (int)Math.Truncate(Math.Log10(x)) + 1; 然而,这表现得相当糟糕。 由于我的应用程序只发送正值,并且长度相当均匀地分布在2到9之间(偏向9),我预先计算了值并使用if语句: static int getLen(long x) { if (x < 1000000) { if (x < 100) return 2; if (x < 1000) return 3; if (x < 10000) return 4; if (x < 100000) return 5; return 6; } else { if (x < 10000000) return 7; if (x […]

试试看。块块总是很贵?

可能重复: 当没有抛出exception时,try / catch块是否会损害性能? 嘿大家,关于try..catch块的快速问题。 我听说它们使用起来很昂贵,不应该用作程序流程的一部分。 但是,为了validation电子邮件地址,我使用以下代码。 try { MailAddress checkEmail = new MailAddress(testEmail); return true; } catch { return false; } 由于事先validation,我没有很多例外被捕获,除非它试图绕过validation。 我的问题是,尝试…如果捕获到exception,Catch块只是昂贵的,或者无论是否抛出任何exception,它总是很昂贵? 谢谢 编辑 :感谢所有的回复。 我已经决定,因为检查(在C#中)不是很贵,我会坚持使用这种方法。 这主要是因为抛出的实际exception是罕见的,因为先前的validation步骤确保没有人意外地输入无效的电子邮件地址。

在C#中确定未修剪字符串是否为空的最有效方法是什么?

我有一个字符串,周围可能有空白字符,我想检查它是否基本上是空的。 有很多方法可以做到这一点: 1 if (myString.Trim().Length == 0) 2 if (myString.Trim() == “”) 3 if (myString.Trim().Equals(“”)) 4 if (myString.Trim() == String.Empty) 5 if (myString.Trim().Equals(String.Empty)) 我知道这通常是一个过早优化的明显案例,但我很好奇,并且有可能做到这一点足以产生性能影响。 那么这些中最有效的方法是哪一种? 有没有更好的方法我没想过? 编辑:此问题的访问者注意事项: 对这个问题进行了一些非常详细的调查 – 特别是来自Andy和Jon Skeet。 如果你在搜索某些内容时偶然发现了这个问题,那么至少阅读Andy和Jon的post是非常值得的。 似乎有一些非常有效的方法, 最有效的方法取决于我需要处理的字符串的内容。 如果我无法预测字符串(在我的情况下我不能预测),Jon的IsEmptyOrWhiteSpace方法通常会更快。 谢谢大家的意见。 我将选择安迪的答案作为“正确”的答案仅仅是因为他应该为他所付出的努力赢得声誉,而Jon已经拥有了十亿美元的声誉。

C#屏幕流媒体节目

最近我一直在做一个简单的屏幕共享程序。 实际上该程序适用于TCP protocol并使用桌面复制API – 一种支持非常快速的屏幕捕获的酷服务,还提供有关MovedRegions (仅改变其在屏幕上的位置但仍然存在的区域)和UpdatedRegions (更改区域)的信息。 桌面复制有2个重要属性 – 2个字节数组,一个用于previouspixels一个NewPixels数组和一个NewPixels数组。 每4个字节代表一个RGBAforms的像素,例如,如果我的屏幕是1920 x 1080,则缓冲区大小为1920 x 1080 * 4。 以下是我的策略的重要亮点 在初始状态(第一次)我发送整个像素缓冲区(在我的情况下它是1920 x 1080 * 3) – alpha组件在屏幕上始终为255 🙂 从现在开始,我遍历UpdatedRegions(它是一个矩形数组),我发送区域边界和Xo’r像素,如下所示: writer.Position = 0; var n = frame._newPixels; var w = 1920 * 4; //frame boundaries. var p = frame._previousPixels; foreach (var region in frame.UpdatedRegions) { writer.WriteInt(region.Top); writer.WriteInt(region.Height); writer.WriteInt(region.Left); […]

优化查找:字典键查找与数组索引查找

我正在写一个7卡扑克手评估员作为我的宠物项目之一。 在尝试优化速度时(我喜欢挑战),我惊讶地发现,与数组索引查找相比,Dictionary键查找的性能相当慢。 例如,我运行了这个示例代码,列举了所有52个选择7 = 133,784,560个可能的7个牌手: var intDict = new Dictionary(); var intList = new List(); for (int i = 0; i < 100000; i ++) { intDict.Add(i, i); intList.Add(i); } int result; var sw = new Stopwatch(); sw.Start(); for (int card1 = 0; card1 < 46; card1++) for (int card2 = card1 + 1; card2 […]

使用.NET提高枚举文件和文件夹的性能

我有一个包含几千个文件夹的基目录。 在这些文件夹中,可以有1到20个子文件夹,包含1到10个文件。 我想删除所有超过60天的文件。 我使用下面的代码来获取我必须删除的文件列表: DirectoryInfo dirInfo = new DirectoryInfo(myBaseDirectory); FileInfo[] oldFiles = dirInfo.GetFiles(“*.*”, SearchOption.AllDirectories) .Where(t=>t.CreationTime < DateTime.Now.AddDays(-60)).ToArray(); 但我让它运行了大约30分钟,但仍然没有完成。 我很好奇是否有人能够看到我可以提高上述线路的性能,或者如果有不同的方式我应该完全接近这个以获得更好的性能? 建议?