Tag: 优化

如何在窗口电话8.1中改进性能方法GetThumbnailAsync

我在窗口电话8.1中写了一个函数来显示文件夹上的图像(假设我在这个文件夹中有大约60个图像 )。 问题是函数GetThumbnailAsync()在创建流来获取bitmapImage时需要很长时间 。 这是我的代码 //getFileInPicture is function get all file in picture folder List lstPicture = await getFileInPicture(); foreach (var file in lstPicture) { var thumbnail = await file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.PicturesView,50); var bitmapImage = new BitmapImage(); bitmapImage.DecodePixelWidth = (int)(ScreenWidth / 4); await bitmapImage.SetSourceAsync(thumbnail); g_listBitmapImage.Add(bitmapImage); //g_listBitmapImage is a list of bitmapImage } 我是测试, 发现问题是函数GetThumbnailAsync花了这么长时间 。 如果我有大约60张图片,则需要大约15秒来完成此function(我在lumia 730中测试)。 […]

方法优化

我有一个void函数,其中包含很多if语句,所有这些都是必需的,我真的无法删除任何东西。 但我觉得它可以做得更好。 使用一些LINQ.Where ,类或类似的东西。 我想在尽可能少的字符中优化和表达void Smooth : void Smooth(ref int botChips, ref bool botTurn, Label botStatus, int name, int n, int r) { Random rand = new Random(); int rnd = rand.Next(1, 3); if (rounds == 0 || rounds == 1) { if (call = RoundN(botChips, n)) { Call(ref botChips, ref botTurn, botStatus); } else […]

JIT拒绝内联微小的方法

我缺少严肃的优化,因为JIT不会内联我的很多方法。 例如,让我们有以下代码: static void Main(string[] args) { IsControl(‘\0’); } public static bool IsControl(char c) { return ((c >= 0 && c = 127 && c <= 159)); } 在JIT编译之后生成以下内容: 0000001f xor ecx,ecx 00000021 call FFFFFFFFFFEC9760 00000026 mov byte ptr [rsp+20h],al 0000002a nop 0000002b jmp 000000000000002D 0000002d add rsp,38h 00000031 rep ret 请注意, 0000001f是我设置断点的地方。 如你所见,在00000021有一个电话,这是绝对错误的。 为什么这么小的方法不适合内联? […]

在C#中迭代树的微优化

我正在做一个大规模的运算项目。 我从一开始就一直在优化所有内容,因为我知道它很重要。 进行性能分析我的代码在一个函数中花费了近40%的生命 – 二叉树迭代器。 public ScTreeNode GetNodeForState(int rootIndex, float[] inputs) { 0.2% ScTreeNode node = RootNodes[rootIndex].TreeNode; 24.6% while (node.BranchData != null) { 0.2% BranchNodeData b = node.BranchData; 0.5% node = b.Child2; 12.8% if (inputs[b.SplitInputIndex] <= b.SplitValue) 0.8% node = b.Child1; } 0.4% return node; } 任何C#优化专家都有进一步优化的提示吗? 所有的比较都是花车。 我知道理论上它应该没关系,但我使用的是字段而不是属性,所以要确保优化。 在这里节省一点钱可以减少过程。 请不要回答说“这些优化在现实世界中并不重要” – 因为在这种情况下他们会这样做。 🙂 编辑:我已经将代码更新为我现在遵循以下注释的内容,并在每行代码的性能分析输出中添加。 […]

在回收价值类型统一是否有一点

我发现文章说回收和重用变量是团结的好习惯。 所以我采纳了它。 但有一点不清楚:这是否适用于值类型变量(整数,向量)? 有没有一点我使用这个: int x; Vector3 v; void functionCalledVeryOften(){ x=SomeCalculation(); v=SomeCalc(); //do something with x and v } 而不是这个: void functionCalledVeryOften(){ int x=SomeCalculation(); Vector3 v=SomeCalc(); //do something with x and v }

for-loop optimization – 需要与否?

我是否必须像下面那样优化我的FOR循环,否则编译器会为我做这个? //this is slow, right? for (int i = 0; i < menuItem.DropDownItems.Count; i++) { … } //this should be much faster right? for (int i = 0, count = menuItem.DropDownItems.Count; i < count; i++) { … } PS。 我打赌这已经发布但我没有找到任何东西,抱歉可能有重复。 PPS。 对不起,我编写了很多JavaScript代码 – 我们必须考虑这些优化……在.net-world中可能看起来很荒谬。

使用中继器和SQL定制分页

我一直在寻找一个很好的教程,教我如何使用像Repeater这样的简单DataBound控件来实现自定义的Paging控件,以实现高性能的分页function。 我发现了很多关于这个问题的文章,但没有一个是完整的答案。 在ASP.NET中分析大型结果集 这个很棒,有统计数据和不同方法之间的比较,但问题是它在SQL Server拥有它的新functionROW_NUMBER()之前已经太旧了 使用ASP.NET 3.5的N层Web应用程序第4部分:排序,分页和过滤(数据库分页部分,忽略其余部分) 这个几乎是完美的,但他使用网格现有的分页function和定制的分页方法,而不是转发器。 使用ASP.NET Repeater或DataList控件自定义SEO友好分页 我认为这个过于复杂,事情可以变得更容易 我正在使用SQL,Items Repeater(在没有使用数据源的代码隐藏中使用直接绑定),PageNumbers转发器(它将具有作为ItemTemplate的链接以传递查询字符串,因此使用的方法可以检索项的下一部分),用于保存当前页码和标题的标签。 我一直在尝试使用ASP.NET 3.5第4部分:排序,分页和过滤(数据库分页部分,忽略其余部分)在N层Web应用程序上实现该示例。 到目前为止,我已经在我的数据访问Lyaer中创建了一个SQL命令,如下所示: WITH Records AS ( SELECT ItemId, ItemName, ROW_NUMBER() OVER (ORDER BY ItemId) AS ‘RowNumber’ FROM Items) SELECT * FROM Records WHERE (RowNumber BETWEEN (@startIndex) AND @startIndex + @pageSize – 1) 但现在我被困在如何在我的表示层使用它!

确定文件标识的算法(优化)

继这个问题: 用于确定文件身份的算法 回顾 :我正在寻找一种用于确定文件标识的廉价算法,该算法在绝大多数情况下都有效。 我继续并实现了一种算法,它为每个文件提供了“ 非常独特 ”的哈希值。 我的算法的工作方式是: 对于小于特定阈值的文件,我使用标识哈希的完整文件内容。 对于大于阈值的文件,我采用X大小的随机N个样本。 我将文件大小包含在散列数据中。 (意味着具有不同大小的所有文件导致不同的哈希) 问题: 我应该为N和X选择什么值(我应该选择多少随机样本的大小?)我选择了4个样本,每个8K,并且不能算法算法。 我发现增加样本量会迅速降低算法的速度(导致搜索非常昂贵) 数学一:我的文件需要多少才能让这个算法爆炸。 (2个具有相同长度的不同文件最终具有相同的哈希值) 优化一:有什么方法可以优化我的具体实现来提高吞吐量(我似乎能够在我的系统上每秒做大约100个文件)。 这个实现看起来是否合理? 你能想到任何真实世界的例子吗? (我的重点是媒体文件) 相关信息: 我实现的算法 谢谢你的帮助!

为IList优化LINQ

不久之前,我编写了一个IList扩展方法,通过使用索引来枚举列表的一部分。 在重构时我意识到可以通过调用Skip(toSkip).Take(amount)来执行类似的查询Skip(toSkip).Take(amount) 。 在对此进行基准测试时,我注意到Skip并未针对IList进行优化。 通过一些谷歌搜索,我最终在Jon Skeet的post, 讨论为什么像Skip这样的优化方法很危险 。 据我理解这篇文章,问题是在修改集合时抛出优化方法时没有exception,但是作为注释声明msdn文档本身就存在冲突。 在IEnumerator.MoveNext()中 : 如果对集合进行了更改,例如添加,修改或删除元素,则枚举数将无法恢复,并且下一次调用MoveNext或Reset 会引发InvalidOperationException。 在IEnumerator.GetEnumerator()中 : 如果对集合进行了更改(例如添加,修改或删除元素),则枚举数将无法恢复,并且其行为未定义 。 我认为两种惯例都有用,而且无论是否进行优化都会有点失落。 什么是正确的解决方案? 我一直在考虑按照Kris Vandermotten在评论中提到的IList.AssumeImmutable()方式的IList.AssumeImmutable()方法。 是否已存在任何实现,或者这是一个坏主意?

优化DateTime.Now的替代方案

我和一位同事在这个问题上来回走动,我希望得到一些外界意见,看看我提出的解决方案是否是一个好主意。 首先,免责声明:我意识到“优化DateTime.Now ”的概念对你们中的某些人来说听起来很疯狂。 我有几个先发制人的防御措施: 我有时会怀疑那些总是说“计算机速度快;可读性总是在优化之前”的人经常会从开发应用程序的经验中说出,虽然这些应用程序可能很重要但性能并不重要 。 我说的是要尽可能接近瞬间发生事情 – 比如,在几纳秒内(在某些行业中,这很重要 – 例如,实时高频交易)。 即使考虑到这一点,我在下面描述的替代方法实际上是非常易读的。 这不是一个奇怪的黑客,只是一个可靠而快速工作的简单方法。 我们有跑步测试。 DateTime.Now 很慢(相对来说)。 下面的方法更快。 现在,问题本身。 基本上,通过测试,我们发现DateTime.Now大约需要25个滴答(大约2.5微秒)才能运行。 当然,这是平均数千到数百万次通话的平均值。 看起来第一个呼叫实际上需要花费大量时间,后续呼叫要快得多。 但仍然是25个蜱是平均值。 然而,我和我的同事注意到DateTime.UtcNow运行的时间要少得多 – 平均只有0.03微秒。 鉴于我们的应用程序永远不会在夏令时发生变化时运行 ,我的建议是创建以下类: public static class FastDateTime { public static TimeSpan LocalUtcOffset { get; private set; } public static DateTime Now { get { return DateTime.UtcNow + LocalUtcOffset; } } static […]