Tag: 优化

使用属性和性能

我正在优化我的代码,我注意到使用属性(甚至是自动属性)会对执行时间产生深远的影响。 请参阅以下示例: [Test] public void GetterVsField() { PropertyTest propertyTest = new PropertyTest(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); propertyTest.LoopUsingCopy(); Console.WriteLine(“Using copy: ” + stopwatch.ElapsedMilliseconds / 1000.0); stopwatch.Restart(); propertyTest.LoopUsingGetter(); Console.WriteLine(“Using getter: ” + stopwatch.ElapsedMilliseconds / 1000.0); stopwatch.Restart(); propertyTest.LoopUsingField(); Console.WriteLine(“Using field: ” + stopwatch.ElapsedMilliseconds / 1000.0); } public class PropertyTest { public PropertyTest() { NumRepet = 100000000; […]

C#生成IL for ++运算符 – 何时以及为什么前缀/后缀表示法更快

由于这个问题是关于增量运算符和带有前缀/后缀表示法的速度差异,我将非常谨慎地描述这个问题,以免Eric Lippert发现它并激怒我! (有关我所询问原因的更多信息和详细信息,请访问http://www.codeproject.com/KB/cs/FastLessCSharpIteration.aspx?msg=3899456#xx3899456xx/ ) 我有四个代码片段如下: – (1)单独,前缀: for (var j = 0; j != jmax;) { total += intArray[j]; ++j; } (2)单独,后缀: for (var j = 0; j != jmax;) { total += intArray[j]; j++; } (3)Indexer,Postfix: for (var j = 0; j != jmax;) { total += intArray[j++]; } (4)索引器,前缀: for (var j = […]

事件处理程序性能

我有性能问题。 我创建了100个新按钮,我想分配一个Click事件处理程序。 我执行此代码大约100次: Buttons[i].Button.Click += new System.EventHandler(Button_Click); 完成大约需要2秒。 我在同一个函数中有很多其他事件赋值,但它们只需要几毫秒来执行。 所以我已经改变了我的代码 Buttons[i].Button.MouseUp += new System.Windows.Forms.MouseEventHandler(Button_Click); 现在代码很快(几毫秒,就像其他代码一样)。 显然,我修改了函数“Button_click”的参数以适应新的事件要求,但没有进行其他更改。 我想知道为什么会发生这种情况。 EventHandler会慢吗? 或者我做错了什么? 还是有最好的做法? 我在C#中使用VC2010,在Windows窗体应用程序中使用.NET 4。 编辑: 现在我已经“缩小”了我的代码并将其放在那里: Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); Button b; for(n=0;n<100;n++) { b = new Button(); b.Location = new System.Drawing.Point(100, 0); b.Name = "btnGrid"; b.Size = new System.Drawing.Size(50, 50); b.Text = b.Name; b.UseVisualStyleBackColor […]

C#与C ++性能 – 为什么.NET不执行最基本的优化(如死代码消除)?

我非常怀疑C#或.NET JIT编译器是否执行任何有用的优化,更不用说如果它们实际上与C ++编译器中最基本的编译器竞争。 考虑这个非常简单的程序,我方便地在C ++和C#中都有效: #if __cplusplus #else static class Program { #endif static void Rem() { for (int i = 0; i < 1 << 30; i++) ; } #if __cplusplus int main() #else static void Main() #endif { for (int i = 0; i < 1 << 30; i++) Rem(); } #if __cplusplus […]

启动VS Profiler可提升应用程序性能x20?

编辑1 我根本不排除这可能是由于使用Profiler的一些非常基本的副作用(我的“常规”项目中的一些错误设置) 我想在我的应用程序中改进计算时间,所以我决定进行彻底的分析分析。 所以我刚刚启动了.Net内存分配配置文件来分析我的应用程序。 我完全惊呆了,观看计算速度快了20倍 ! 应用程序包括从带有BackgroundWorkers的二进制文件中读取数据,处理它们, 并将结果存储到MSSQL DB中。 每轮通常需要20秒,而分析它几乎需要1秒。 我检查并确保两种情况下结果一致。 一个.Net实验的朋友告诉我,探查器优化了线程并“以某种方式”找到了通过线程锁和瓶颈的方式,但我简直不敢相信。 所以我的问题是: 究竟发生了什么,现在和为什么? 如何使我的代码本机行为? 编辑2 我知道这听起来很疯狂,令人难以置信。 我自己仍然非常怀疑。但它是真的。 在分析器运行时,SAME代码运行得非常快。 我使用SAME测试数据,并观察SAME计算输出。 我无法给出一个简单的复制项目,因为它是一个相对较大的框架。 我正在使用Visual Studio 2010 Profiler。 我将尽可能多地提供关于流程的详细信息,一旦找到它,我肯定会发布一条线索。 定期运行日志: 03/23/2011 18:04:34 | 180434.621 | 模拟集[5] – [1] – [5 PC-1 0 [SET 1/48] 03/23/2011 18:05:01 | 180501.271 | 处理时间:00:00:26.6515244 等等.. Profiler运行LOGS: 03/24/2011 11:38:15 | 113815.592 | 模拟集[5] […]

何时在C#中使用锁定线程?

我有一个服务器,它处理多个传入的套接字连接,并创建2个不同的线程,以XML格式存储数据。 我几乎在每个名为asyncronously的事件处理程序和代码的不同部分的2个线程中使用lock语句来实现线程安全。 遗憾地使用这种方法我的应用程序显着减慢。 我试图完全不使用lock ,服务器执行速度非常快,即使文件存储似乎也在提升; 但程序因30秒-1分钟后我不理解的原因而崩溃。 工作的。 所以。 我认为最好的方法是使用较少的锁或只在必要的地方使用它。 因此,我有两个问题: 当我写入公共访问变量(C#列表)时,甚至当我从中读取时,是否需要锁定? 是否只需要在套接字处理程序或其他地方创建的异步线程中进行锁定? 有人可以给我一些关于如何操作的实用指南。 我这次不会发布整个代码。 发布大约2500行代码是没有意义的。

公共领域还可以吗?

在你对肠道的反应之前,正如我最初所做的那样,请阅读整个问题。 我知道他们让你觉得很脏,我知道我们以前都被烧过,我知道这不是“好风格”,但公共场地还好吗? 我正在开发一个相当大规模的工程应用程序,它可以创建并使用结构的内存模型(从高层建筑到桥梁到棚屋,无关紧要)。 该项目涉及TON的几何分析和计算。 为了支持这一点,该模型由许多微小的不可变只读结构组成,用于表示点,线段等事物。这些结构的某些值(如点的坐标)可被访问数十亿或数亿典型程序执行期间的时间。 由于模型的复杂性和计算量,性能绝对至关重要。 我觉得我们正在尽我们所能来优化我们的算法,性能测试以确定瓶颈,使用正确的数据结构等。我不认为这是过早优化的情况。 性能测试显示直接访问字段而不是通过对象上的属性时性能提升的数量级 (至少)。 鉴于此信息,以及我们还可以公开与属性相同的信息以支持数据绑定和其他情况……这样可以吗? 请记住,只读不可变结构上的字段。 任何人都可以想到我会后悔的原因吗? 这是一个示例测试应用程序: struct Point { public Point(double x, double y, double z) { _x = x; _y = y; _z = z; } public readonly double _x; public readonly double _y; public readonly double _z; public double X { get { return _x; } […]

是否会执行逻辑表达式中的所有方法?

在C#中,给出了两种方法 bool Action1(object Data); bool Action2(object Data); 在if语句中使用,如下所示: if ( Action1(Data) || (Action2(Data) ) { PerformOtherAction(); } 如果Action1()返回true仍然会调用Action1() ,或者编译器优化是否会阻止Action1() ,因为已经知道表达式将计算为true ?

写文件需要针对繁重的流量第2部分进行优化

如果有兴趣看到我来自哪里,你可以参考第1部分,但没有必要。 写文件需要针对繁重的流量进行优化 下面是我编写的一段代码,用于从代理API中捕获一些财务报表数据。 代码将无错误地运行。 我需要优化代码,因为在高峰时段,zf_TickEvent方法每秒调用的次数超过10000次。 我使用内存流来保存数据,直到达到一定的大小,然后将其输出到文本文件中。 代理API仅是单线程的。 void zf_TickEvent(object sender, ZenFire.TickEventArgs e) { outputString = string.Format(“{0},{1},{2},{3},{4}\r\n”, e.TimeStamp.ToString(timeFmt), e.Product.ToString(), Enum.GetName(typeof(ZenFire.TickType), e.Type), e.Price, e.Volume); fillBuffer(outputString); } public class memoryStreamClass { public static MemoryStream ms = new MemoryStream(); } void fillBuffer(string outputString) { byte[] outputByte = Encoding.ASCII.GetBytes(outputString); memoryStreamClass.ms.Write(outputByte, 0, outputByte.Length); if (memoryStreamClass.ms.Length > 8192) { emptyBuffer(memoryStreamClass.ms); memoryStreamClass.ms.SetLength(0); memoryStreamClass.ms.Position […]

Webapi2 – 在一个任务完成后从控制器操作返回,但继续进一步的异步处理

我有一个关于Webapi2的问题 我的应用程序是完全async/await ,但我想优化最后一部分。 我很难找到,所以有什么办法可以做到以下几点吗? webapi2控制器的一个示例: private async Task Barfoo(Bar foo) { //some async function } public async Task Foo(Bar bar) { List tasks=new List(); var actualresult=Barfoo(bar.Bar); tasks.Add(actualresult); foreach(var foobar in bar.Foo) { //some stuff which fills tasks } await Task.WhenAll(tasks); return Ok(actualresult.Result); } 客户端只需要一个function,所以我想要的更像是: private async Task Barfoo(Bar foo) { //some async function } public […]