Tag: optimization

优化字符串连接的聚合

更新 – 对于那些具有诙谐心态的人来说,你可以假设,无论函数传递给它,Aggregate仍会产生正常结果,包括在优化的情况下。 我编写了这个程序来构建一个从0到19999的长整数字符串,用逗号分隔。 using System; using System.Linq; using System.Diagnostics; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { const int size = 20000; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); Enumerable.Range(0, size).Select(n => n.ToString()).Aggregate((a, b) => a + “, ” + b); stopwatch.Stop(); Console.WriteLine(stopwatch.ElapsedMilliseconds + “ms”); } } } 当我运行它时,它说: 5116ms 超过五秒钟,太可怕了。 当然这是因为每次循环都会复制整个字符串。 […]

在合并之间合并字体pdfs itextsharp C#

我需要将多个pdf合并在一起。 我正在使用itextsharp来创建所有的pdf。 我需要将pdf的大小减小到尽可能小的大小。 我知道每个pdf的字体都是重复的。 在合并的pdf中是否只使用一组字体? 例如,pdf1是2.8mb,pdf2是2.8mb我将它们合并在一起,大约5.7mb。 我知道这两个pdf都使用相同的字体,但字体的数据正在被删除,即使它在相同的pdf中。 我尝试使用压缩属性设置为最佳压缩并设置完全压缩,并且几乎不会减小尺寸。 虽然当我通过Acrobat X pro运行pdf并优化其减少近90%+从160 mb到5 mb。 使用情况审计表明,在优化之前,其90%的pdf是字体。 现在有没有办法合并pdfs合并之间的字体?

编译器是否对异步方法链执行“返回值优化”

在传统意义上没有返回值优化,但我想知道你什么时候有这样的情况: private async Task Method1() { await Method2(); } private async Task Method2() { await Method3(); } private async Task Method3() { //do something async } 这显然可以写得更优: private Task Method1() { return Method2(); } private Task Method2() { return Method3(); } private async Task Method3() { //do something async } 我只是想知道是否有人知道(MS)编译器是否足够聪明,不能在第一个实例中为Method1()和Method1()生成状态机?

需要优化计数正负值

我需要优化计算pos / neg值的代码并按时间删除不合格的值。 我有附加时间戳的值队列。 我需要丢弃1ms的值并计算负值和正值。 这是伪代码 list l; v = q.dequeue(); deleteold(l, v.time); l.add(v); negcount = l.count(i => i.value i.value >= 0); if(negcount == 10) return -1; if(poscount == 10) return 1; 我需要在c#中以最大速度运行此代码。 无需坚持清单。 事实上,欢迎以neg和pos值分隔的数组。 编辑:可能不安全的数组将是最好的。 任何提示? 编辑:感谢抬头..我很快测试了arrays版本与列表(我已经拥有)并且列表更快:35毫秒与16毫秒的1密耳迭代…… 以下是公平的代码: class Program { static int LEN = 10; static int LEN1 = 9; static void Main(string[] […]

if(var == true)是否比if(var!= false)更快?

非常简单的问题。 我知道这可能是一个很小的优化,但最终你会使用足够的if语句来解决它。 编辑:谢谢那些提供了答案的人。 对于那些觉得有必要打击我的人,要知道好奇心和对知识的渴望并不能转化为愚蠢。 非常感谢所有提出建设性批评的人。 到目前为止,我还不知道是否(var)。 我很确定我现在会用它。 ;)

强制.NET JIT编译器在应用程序启动期间生成最优化的代码

我正在用C#编写一个DSP应用程序(基本上是一个多轨编辑器)。 我在不同的机器上进行了很长一段时间的分析,我注意到了一些“好奇”的东西。 在我的家用机器上,回放循环的第一次运行占用了可用时间的大约50%-60%,(我认为这是由于JIT正在完成其工作),然后对于后续循环,它会下降到稳定的5 % 消费。 问题是,如果我在较慢的计算机上运行应用程序,第一次运行占用的时间超过可用时间,导致播放中断并弄乱输出音频,这是不可接受的。 之后,它降至8%-10%的消费量。 即使在第一次运行之后,应用程序仍然不时地调用一些耗时的例程(每2秒或多或少),这导致稳定的5%消耗经历非常短的20%-25%的峰值。 我注意到如果我让应用程序运行一段时间,这些峰值也会下降到7%-10%。 (我不确定这是否是由于JIT重新编译这些代码部分)。 所以,我对JIT有一个严重的问题。 虽然应用程序即使在非常慢的机器中也能很好地运行,但这些“编译风暴”将成为一个大问题。 我试图弄清楚如何解决这个问题,我想出了一个想法,即用一个属性标记所有’明智的’例程,告诉应用程序在启动时预先“挤压”它们因此,当他们真正需要时,他们将完全优化。 但这只是一个想法(我也不太喜欢),我想知道是否有更好的解决方案来解决整个问题。 我想听听你们的想法。 (NGEN应用程序不是一个选项,我喜欢并希望我能获得所有JIT优化。) 编辑: 内存消耗和垃圾收集没有问题,我正在使用对象池,播放期间的最大内存峰值为304 Kb。

C#/ XNA – 乘法比分区更快?

我最近看到一条推文让我很困惑(这是由XNA编码器在编写XNA游戏时发布的): 当天的微优化提示:在可能的情况下,在高频区域使用乘法而不是除法。 它的速度提高了几个周期。 我很惊讶,因为我一直认为编译器非常聪明(例如,使用位移),最近读了Shawn Hargreaves的一篇文章说了很多相同的事情 。 我想知道这有多少真相,因为我的游戏中有很多计算。 我询问,希望有一个样本,但原始的海报无法给出一个。 然而,他这样说: 不一定是“center = width / 2”之类的东西。 我已经确定“是的,这是值得的”。 🙂 所以,我很好奇…… 任何人都可以给出一些代码示例,您可以将分区更改为乘法并获得性能增益,而C#编译器本身无法执行相同的操作。

C#编译器和JIT都做了哪些优化?

我正在继续我的编译器类的C#编译工作。 目前我已经完成了教科书中关于编译器优化的章节。 在大多数情况下,我的教科书在编写时没有及时编译,我很好奇C#编译器执行的静态,pre-jit优化的种类与JIT过程中的执行情况。 ? 当我与人们谈论编译CLR时,我通常会听到“大多数优化都是由JIT完成的”。 是循环展开,常量折叠/传播,C#编译器在Jit之前完成指令交织还是由抖动处理? 如果它们不是由抖动处理的,那么抖动会做什么样的优化,这对于即时编译器来说是唯一的?

MS C#编译器和非优化代码

注意:我发现我发布的示例中有一些错误 – 编辑修复它 如果你不启用优化,官方的C#编译器会做一些有趣的事情。 例如,一个简单的if语句: int x; // … // if (x == 10) // do something 如果优化,会变成以下内容: ldloc.0 ldc.i4.s 10 ceq bne.un.s do_not_do_something // do something do_not_do_something: 但如果我们禁用优化,它会变成这样: ldloc.0 ldc.i4.s 10 ceq ldc.i4.0 ceq stloc.1 ldloc.1 brtrue.s do_not_do_something // do something do_not_do_something: 我无法理解这一点。 为什么所有额外的代码,似乎在源中不存在? 在C#中,这相当于: int x, y; // … // y = x […]

使用XNA绘制矩形

我正在做游戏。 当有事情发生时,我想在屏幕上突出显示一个位置。 我为我创建了一个类,并找到了一些绘制矩形的代码: static private Texture2D CreateRectangle(int width, int height, Color colori) { Texture2D rectangleTexture = new Texture2D(game.GraphicsDevice, width, height, 1, TextureUsage.None, SurfaceFormat.Color);// create the rectangle texture, ,but it will have no color! lets fix that Color[] color = new Color[width * height];//set the color to the amount of pixels in the textures for (int […]