草庐IT

OPTIMIZATION

全部标签

c# - 使用属性和性能

我正在优化我的代码,我注意到使用属性(甚至是自动属性)对执行时间有深远的影响。请参见下面的示例:[Test]publicvoidGetterVsField(){PropertyTestpropertyTest=newPropertyTest();Stopwatchstopwatch=newStopwatch();stopwatch.Start();propertyTest.LoopUsingCopy();Console.WriteLine("Usingcopy:"+stopwatch.ElapsedMilliseconds/1000.0);stopwatch.Restart();pro

c# - 我可以强制编译器优化特定方法吗?

是否有一个属性可以用来告诉编译器必须始终优化方法,即使未设置全局/o+编译器开关?我问的原因是因为我在玩弄基于现有方法的IL代码动态创建方法的想法;当代码经过优化时,我想做的操作相当容易,但在未优化的代码中变得非常困难,因为编译器生成了额外的指令。编辑:关于困扰我的非优化的更多细节......让我们考虑以下阶乘函数的实现:staticlongFactorialRec(intn,longacc){if(n==0)returnacc;returnFactorialRec(n-1,acc*n);}(注意:我知道有更好的方法来计算阶乘,这只是一个例子)启用优化后生成的IL非常简单:IL_000

c# - Entity Framework 4 中的左外连接太多了吗?

这个问题在这里已经有了答案:SimpleLinqqueryhasduplicatedjoinagainstsametable?(3个答案)关闭3年前。我有一个产品实体,其中包含0或1个“BestSeller”实体。出于某种原因,当我说:db.Products.OrderBy(p=>p.BestSeller.rating).ToList();我得到的SQL有一个“额外的”外连接(如下)。如果我添加第二个0或1关系船,并按两者排序,那么我得到4外连接。似乎每个这样的实体都在生成2个外部连接而不是一个。LINQtoSQL的行为完全符合您的预期,没有额外的连接。有没有其他人遇到过这个问题,或者

c# - 算法挑战 : merging date range

我遇到了一个有趣的问题:我有几个可以重叠的日期范围他们每个人都有一个名字是否可以“消除重叠”这些范围?即生成:一组新的范围,其中没有一个与其他范围重叠每个新范围都有相应名称的列表也许我可以让它更形象一些。这是我首先拥有的:a|------------------------------|b|-------------------|c|-----------------|这是我想要得到的:|------|---------|-------|-----|-----|aa,ca,b,ca,bb我找到了一种可行但不够优雅的解决方案:我将每个范围(从、到)转换为天数列表(d1、d2、d3等)我按

c# - C# 编译器或 JIT 能否优化掉 lambda 表达式中的方法调用?

我是在关于另一个StackOverflow问题的讨论(incomments)之后开始这个问题的,我很想知道答案。考虑以下表达式:varobjects=RequestObjects.Where(r=>r.RequestDate>ListOfDates.Max());移动ListOfDates.Max()的评价有没有(性能)优势?在这种情况下,在Where子句之外,还是会1.编译器或2.JIT优化它?我相信C#只会在编译时进行常量折叠,并且可以说ListOfDates.Max()在编译时无法知道,除非ListOfDates本身在某种程度上是常量。也许还有另一个编译器(或JIT)优化可以确保

c# - 优化 LINQ Count() > X

这个问题在这里已经有了答案:EfficientLinqEnumerable's'Count()==1'test(7个答案)关闭6年前。问题:给定IEnumerable,如何检查包含超过x的序列项目?MCVE:staticvoidMain(string[]args){vartest=Test().Where(o=>o>2&&o1)//howtooptimizethis?foreach(vartintest)//consumerConsole.WriteLine(t);}staticIEnumerableTest(){for(inti=0;i这里的问题是什么Count()将运行完整的序列,

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

注意:我注意到我发布的示例中存在一些错误-编辑以修复它如果您不启用优化,官方C#编译器会做一些有趣的事情。例如,一个简单的if语句:intx;//...//if(x==10)//dosomething优化后会变成下面这样:ldloc.0ldc.i4.s10ceqbne.un.sdo_not_do_something//dosomethingdo_not_do_something:但是如果我们禁用优化,它就会变成这样:ldloc.0ldc.i4.s10ceqldc.i4.0ceqstloc.1ldloc.1brtrue.sdo_not_do_something//dosomethingd

c# - 编译器是否优化了字符串文字?

C#编译器或.NETCLR是否对字符串文字/常量进行了巧妙的内存优化?我可以发誓我听说过“字符串内部化”的概念,因此在程序中的任何两位代码中,文字“这是一个字符串”实际上指的是同一个对象(大概是安全的,字符串是什么不可变的?)。虽然我在Google上找不到任何有用的引用...我是不是听错了?别担心-我不会用这些信息在我的代码中做任何可怕的事情,只是想更好地理解它在幕后是如何工作的。 最佳答案 编辑:虽然我强烈怀疑下面的陈述对于所有C#编译器实现都是正确的,但我不确定它是否在规范中得到实际保证。规范的第2.4.4.5节讨论了引用相同字

c# - 使用预计算平移数组的快速正弦/余弦

我有以下代码使用预先计算的内存表执行Sin/Cos函数。在下面的例子中,表格有1024*128个项目,涵盖了从0到2pi的所有Sin/Cos值。我知道我可以使用Sin/Cos对称性并仅保留1/4的值,但在计算值时我会有更多的“如果”。privateconstdoublePI2=Math.PI*2.0;privateconstintTABLE_SIZE=1024*128;privateconstdoubleTABLE_SIZE_D=(double)TABLE_SIZE;privateconstdoubleFACTOR=TABLE_SIZE_D/PI2;privatestaticdoubl

c# - 在 C# 中编写 [0..100] 的最佳方法是什么?

我正在尝试想出聪明、清晰和简单的方法来编写描述给定范围内整数序列的代码。这是一个例子:IEnumerableEnumerateIntegerRange(intfrom,intto){for(inti=from;i 最佳答案 这已经在框架中:Enumerable.Range.对于其他类型,您可能对我的MiscUtil中的范围类感兴趣图书馆。 关于c#-在C#中编写[0..100]的最佳方法是什么?,我们在StackOverflow上找到一个类似的问题: http