Tag: 性能

设置C#应用程序以实现最高性能构建

所以我们对我们的计划非常满意。 它在调试模式下快速而稳定,到目前为止,它与客户的版本一致。 我们现在希望从发布版本中获得免费提升。 我现在已经编译了Release with Code Optimization:On。 我有TRACE常数:关闭。 高级 – >输出 – >调试信息 – >无。 除了高效的编码实践和系统架构等,用于调整C#应用程序以获得最佳性能的最佳Visual Studio设置是什么? 据我所知,JITter在Release版本中默认优化IL编译。 代码优化(:On)涉及编译器以及它如何处理内联等。 那是它还是更多? 将TRACE变为常量错误吗? (我们的应用程序用堆栈树邮寄给我们,如果出现严重问题,我不确定TRACE是否与此相关)

C# – ADO.NET的一些高性能最佳实践/技巧是什么?

我决定不使用orm并将直接使用ADO.NET作为我的项目。 我知道我知道它需要更长的时间来编程,但我只是希望页面即使在高峰时也能以高速加载。

C#和.NET:stackalloc

我有一些关于stackalloc运算符function的问题。 它是如何实际分配的? 我认为它的确如下: void* stackalloc(int sizeInBytes) { void* p = StackPointer (esp); StackPointer += sizeInBytes; if(StackPointer exceeds stack size) throw new StackOverflowException(…); return p; } 但我做了一些测试,我不确定它是如何工作的。 我们无法确切地知道它的作用以及它是如何做到的,但我想知道它的基础知识。 我认为堆栈分配(嗯,我确实相信它)比堆分配快。 那么为什么这个例子: class Program { static void Main(string[] args) { Stopwatch sw1 = new Stopwatch(); sw1.Start(); StackAllocation(); Console.WriteLine(sw1.ElapsedTicks); Stopwatch sw2 = new Stopwatch(); sw2.Start(); HeapAllocation(); Console.WriteLine(sw2.ElapsedTicks); } static […]

Func 的性能和inheritance

在使用inheritance和generics时,我一直无法理解在整个代码中使用Func的性能特征 – 这是我发现自己一直使用的组合。 让我从一个最小的测试用例开始,这样我们都知道我们在谈论什么,然后我会发布结果,然后我将解释我期望的内容以及为什么…… 最小的测试用例 public class GenericsTest2 : GenericsTest { static void Main(string[] args) { GenericsTest2 at = new GenericsTest2(); at.test(at.func); at.test(at.Check); at.test(at.func2); at.test(at.Check2); at.test((a) => a.Equals(default(int))); Console.ReadLine(); } public GenericsTest2() { func = func2 = (a) => Check(a); } protected Func func2; public bool Check2(int value) { return value.Equals(default(int)); } public void test(Func […]

在巨大的字符串中替换多个字符串的最快方法

我正在寻找替换大(~1mb)字符串的多个(~500)子串的最快方法。 无论我尝试过什么,似乎String.Replace是最快的方式。 我只关心最快的方式。 不是代码可读性,可维护性等。我不在乎我是否需要使用不安全的代码或预处理原始字符串。 编辑:评论后我添加了一些更多细节: 每个替换迭代将使用其他字符串替换字符串上的ABC(每个替换迭代不同)。 要替换的字符串总是相同的 – ABC将永远是ABC。 从不ABD。 因此,如果有400.000个替换迭代。 每次使用相同的字符串 – ABC – 将替换为其他(不同的)字符串。 我可以控制ABC是什么。 只要它不影响结果,我可以使它超短或超长。 显然,ABC不能打招呼,因为hello将在大多数输入字符串中作为单词存在。 输入示例: ABCDABCABCDABCABCDABCABCDABCD 示例替换为字符串: BC 示例替换为字符串: AA, BB, CC, DD, EE (5 iterations) 示例输出: AAADAAAAAADAAAAAADAAAAAADAAAD ABBDABBABBDABBABBDABBABBDABBD ACCDACCACCDACCACCDACCACCDACCD ADDDADDADDDADDADDDADDADDDADDD AEEDAEEAEEDAEEAEEDAEEAEEDAEED 平均情况:输入字符串为100-200kb,替换迭代次数为40.000次。 最坏的情况:输入字符串是1-2mb,400,000次替换迭代。 我可以做任何事。 并行做,做不安全等等。无论我怎么做。 重要的是它需要尽可能快。 谢谢

ASP.NET MVC URL生成性能

ASP.NET MVC的一个小基准。 浏览代码: public string Bechmark(Func url) { var s = new Stopwatch(); var n = 1000; s.Reset(); s.Start(); for (int i = 0; i < n; i++) { var u = url(); } s.Stop(); return s.ElapsedMilliseconds + " ms, " + ((s.ElapsedMilliseconds) / (float)n) + " ms per link”; } 查看代码: Url.Action(“Login”, “Account”)) %> […]

为什么我的表现慢慢爬行我将方法移动到基类?

我在C#中编写了不可变二进制树的不同实现,我希望我的树从基类inheritance一些常用方法。 不幸的是,从基类派生的类非常慢。 非派生类可以充分发挥作用。 以下是两个几乎相同的AVL树实现,用于演示: AvlTree: http ://pastebin.com/V4WWUAyT DerivedAvlTree: http ://pastebin.com/PussQDmN 这两棵树的代码完全相同 ,但我在基类中移动了DerivedAvlTree.Insert方法。 这是一个测试应用程序: using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Juliet.Collections.Immutable; namespace ConsoleApplication1 { class Program { const int VALUE_COUNT = 5000; static void Main(string[] args) { var avlTreeTimes = TimeIt(TestAvlTree); var derivedAvlTreeTimes = TimeIt(TestDerivedAvlTree); Console.WriteLine(“avlTreeTimes: {0}, derivedAvlTreeTimes: {1}”, avlTreeTimes, derivedAvlTreeTimes); } static […]

最快的log2(int)和log2(float)实现

问题是 是否还有其他(和/或更快)的基本2log实现? 应用 log2(int)和log2(float)操作在许多不同的上下文中非常有用。 仅举几例:压缩算法,3d引擎和机器学习。 在几乎所有这些上下文中,它们都被用在被称为数十亿次的低级代码中……尤其是log2(int)操作非常有用。 因为我发现自己一直在使用log2,所以我不想给出我正在处理的特定应用程序。 同样的事实是,这是一个真正的性能排水器(如各种应用程序的性能测试所示)。 对我来说,尽可能快地获得这个是关键。 底部添加了测试所有实现的完整源代码,因此您可以自己查看。 当然……运行你的测试至少3次,并确保计数器足够大,可以达到几秒钟。 我也做’添加’操作,以确保整个循环不被JIT’ter神奇地移除。 让我们开始真正的工作吧。 琐碎的实施 C#中2log的简单实现是: (int)(Math.Log(x) / Math.Log(2)) 这种实现很简单,但也很慢。 它需要2个Log操作,这本身就很慢。 当然,我们可以通过使1.0/Math.Log(2)成为常数来优化它。 请注意,我们需要稍微修改此常量以获得正确的结果(作为浮点错误的结果)或添加一个小数字以获得正确的结果。 我选择了后者,但这并不重要 – 最终结果在所有情况下都很慢。 表查找 更快的解决方案是使用查找表。 虽然您可以使用任何2的幂的查找表,但我通常使用256或64K条目的表大小。 首先我们创建查找表: lookup = new int[256]; for (int i = 1; i < 256; ++i) { lookup[i] = (int)(Math.Log(i) / Math.Log(2)); } 接下来,我们实现2log如下: private static int LogLookup(int i) […]

.NET中更快(不安全)的BinaryReader

我遇到了一个情况,我有一个非常大的文件,我需要从中读取二进制数据。 因此,我意识到.NET中的默认BinaryReader实现非常慢。 用.NET Reflector查看它后,我发现了这个: public virtual int ReadInt32() { if (this.m_isMemoryStream) { MemoryStream stream = this.m_stream as MemoryStream; return stream.InternalReadInt32(); } this.FillBuffer(4); return (((this.m_buffer[0] | (this.m_buffer[1] << 8)) | (this.m_buffer[2] << 0x10)) | (this.m_buffer[3] << 0x18)); } 这让我觉得非常低效,想到自32位CPU发明以来计算机是如何设计用于32位值的。 所以我使用这样的代码创建了我自己的(不安全的)FastBinaryReader类: public unsafe class FastBinaryReader :IDisposable { private static byte[] buffer = new byte[50]; //private Stream baseStream; […]

.Net 4中这种巨大的性能差异背后的原因是什么?

我刚刚在RedBlack Tree上做了一些研究。 我知道.Net 4.0中的SortedSet类使用RedBlack树。 所以我使用Reflector取出了那部分并创建了一个RedBlackTree类。 现在我在这个RedBlackTree和SortedSet上运行一些perf测试,插入40000个顺序积分值(从0到39999开始),我惊讶地发现有很大的性能差异如下: RBTree took 9.27208 sec to insert 40000 values SortedSet took 0.0253097 sec to insert 40000 values 它背后的原因是什么? 顺便说一句,我只在Release配置中运行测试,这里是一个小测试代码 var stopWatch = new Stopwatch(); var rbT = new RedBlackTree(); stopWatch = new Stopwatch(); stopWatch.Start(); for (int i = 0; i < 40000; i++) { rbT.Add(i); } stopWatch.Stop(); Console.WriteLine(stopWatch.Elapsed); var ss […]