Tag: 性能

C#更新picturebox中的位图

我正在进行一个屏幕共享项目,我不断收到来自Socket的小块图像,需要在我拥有的某个初始dekstop位图上更新它们。 基本上我不断从套接字读取数据(数据存储为jpeg图像),使用Image.FromStream()检索图像并将接收到的块像素复制到完整的主位图(在特定位置X和Y ,我也得到从套接字) – 这是初始图像更新的方式。 但后来我需要在Picturebox上显示它的Picturebox我处理Paint事件并再次重新绘制它 – 整个初始图像,这是非常大的(在我的情况下是1920X1080)。 这是我的代码: private void MainScreenThread() { ReadData();//reading data from socket. initial = bufferToJpeg();//first intial full screen image. pictureBox1.Paint += pictureBox1_Paint;//activating the paint event. while (true) { int pos = ReadData(); x = BlockX();//where to draw :X y = BlockY();//where to draw :Y Bitmap block = bufferToJpeg();//constantly reciving blocks. […]

减少纬度和经度点数的最快方法

我正在尝试减少并将多个点组合到这些位置的中心点。 现在我通过寻找最接近的一对来强制它,结合它们并重复直到我将它减少到我的目标(旁注:实际上我通过排序(lat*lat+long*long)减少了问题然后在每个点的两边搜索10%,我的测试总是找到该范围内的最短距离)。 举个例子,我想将4000点减少到1000点,理想情况下将最近点组合到最近点的中心。 基本上是构建反映该区域中地址数量的标记点。 有没有更好的算法可以给我尽可能准确的结果? 或者更快的距离算法? 我想它只需要在短距离内准确 现在我找到了距离(维基百科在“投射到飞机上的球形地球”下): double dLat = pos2.LatitudeR – pos1.LatitudeR; double dLon = pos2.LongitudeR – pos1.LongitudeR; double cosLatM = Math.Cos((pos2.LatitudeR + pos1.LatitudeR)/2) * dLon; double a = dLat*dLat + cosLatM*cosLatM; 我已经考虑过将所有点分组在彼此的x距离内,然后扩展x直到达到我的目标最终点数,但我不知道如何使它像我的完美主义所希望的那样准确。 这就是我能想到的所有方式都会略有不同,具体取决于输入点列表的顺序。 编辑以描述我当前的算法如何处理(这是找到我想要的结果的理想方式,但是更快的近似值得): 如果您有x=1,4,5,6,10,20,22 ,则线性描述 它会结合4 + 5 = 4.5 [找到的第一个1.0距离] (4.5 * 2 + 6)/ 3 = 5 – x=1,5,10,20,22 […]

C#WPF应用程序启动非常慢

我写了一个简单的.net WPF应用程序(只包含2个小窗口),但它的发布速度太慢 – 大约10-20秒! Profiler说: Main->RunInternal (56%) Main->RunInternal->ctor->LoadBaml (32%) 应用程序加载时间的最大部分 – 是Main->RunInternal函数的主体,这不是我的function,我不知道它们是什么。 他们的执行时间能以某种方式优化吗? 加载Baml标记需要32%的时间,但我的程序只有3个XAML文件,并且它们包含少于100行代码。 为什么这个动作需要这么长时间? 在询问之前我已经阅读并试过这些技巧,但他们没有帮助我: WPF应用程序启动速度慢 http://msdn.microsoft.com/en-us/library/cc656914.aspx 那么,我怎样才能加快申请的开始时间? 谢谢。 PS。 我在两台类似的计算机上测试了这个程序,结果是一样的。

为什么DateTime.Now DateTime.UtcNow如此慢/昂贵

我意识到这在微优化领域太过分了,但我很想知道为什么调用DateTime.Now和DateTime.UtcNow是如此“昂贵”。 我有一个示例程序运行几个做“一些”工作的场景(添加到一个计数器)并试图这样做1秒钟。 我有几个接近让它在有限的时间内完成工作。 这些示例显示DateTime.Now和DateTime.UtcNow明显慢于Environment.TickCount,但与仅让一个单独的线程hibernate1秒然后设置一个值以指示工作线程停止相比,即使这样也很慢。 所以我的问题是: 我知道UtcNow更快,因为它没有时区信息,为什么它仍然比TickCount慢得多? 为什么读取布尔值比使用int更快? 处理这些类型场景的理想方法是什么,您需要允许某些东西在有限的时间内运行,但是您不想浪费更多的时间来检查时间而不是实际工作? 请原谅示例的详细程度: class Program { private static volatile bool done = false; private static volatile int doneInt = 0; private static UInt64 doneLong = 0; private static ManualResetEvent readyEvent = new ManualResetEvent(false); static void Main(string[] args) { MethodA_PrecalcEndTime(); MethodB_CalcEndTimeEachTime(); MethodC_PrecalcEndTimeUsingUtcNow(); MethodD_EnvironmentTickCount(); MethodX_SeperateThreadBool(); MethodY_SeperateThreadInt(); MethodZ_SeperateThreadLong(); Console.WriteLine(“Done…”); Console.ReadLine(); } private […]

创建一个常量但本地的数组

有时我需要一个单一方法的硬编码查找表。 我也可以创建这样的数组 本地方法本身 类中的静态 第一种情况的示例: public int Convert(int i) { int[] lookup = new[] {1, 2, 4, 8, 16, 32, 666, /*…*/ }; return lookup[i]; } 据我所知,每次执行此方法时,.net引擎都会创建一个新的查找数组。 这是正确的,还是JITer足够聪明,可以在调用之间缓存和重用数组? 我认为答案是否定的,所以如果我想确保在调用之间缓存数组,一种方法是使其static : 第二种情况的示例: private static readonly int[] lookup = new[] { 1, 2, 4, 8, 16, 32, 666, /*…*/ }; public int Convert(int i) { return lookup[i]; […]

Switch语句中的大小写顺序是否会改变性能?

假设我有一个如下的switch语句 switch(alphabet) { case “f”: //do something break; case “c”: //do something break; case “a”: //do something break; case “e”: //do something break; } 现在假设我知道有Alphabet e的频率最高,分别是a,c和f。 所以,我只是重新组织了case语句顺序,并按如下方式进行了重构: switch(alphabet) { case “e”: //do something break; case “a”: //do something break; case “c”: //do something break; case “f”: //do something break; } 第二个switch语句会比第一个switch语句快吗? 如果是,如果在我的程序中我需要多次调用此switch语句,那将是一个实质性的改进吗? 或者,如果没有,我如何使用我的频率知识来提高性能?

性能计数器平均计时器如何与其基础相关联?

我正在为我的c#项目添加一些性能计数器,并创建一个新的PerformanceCounterCategory。 在这个类别中,我想有多个计数器/计时器来跟踪不同的事情。 我需要使用多个平均计时器,并且我试图理解当CoutnerCreationDataCollection中有多个计时器时,AverageBase计数器如何与正确的AverageTimer32计数器相关联。 几个问题: 1.首先,这是一个正确的方法吗? 我发现的样本都只有一个平均计时器。 2.如果第一个问题的答案是肯定的,那么我认为第一个AverageBase计数器是在AverageTimer32之后添加到集合中的吗? 我确实在文章中找到了一个需要按顺序添加的参考。 这是我想要做的一个例子: var dataColl = new CounterCreationDataCollection { new CounterCreationData { CounterType = PerformanceCounterType.AverageTimer32, CounterName = “AverageTime1”, CounterHelp = “AverageTime1_Help” }, new CounterCreationData // Does this get linked to AverageTime1 simply // because it is being added after it? { CounterType = PerformanceCounterType.AverageBase, CounterName = “AverageTime1Base” }, new […]

二进制搜索SortedList的键

我需要为线性插值编写一些代码,并且我试图找出最有效的方法来搜索SortedList的键,用于围绕我的目标键的上下键。 SortedList xyTable = new SortedList() { {1, 10}, {2, 20}, {3, 30}, {4,40} }; double targetX = 3.5; 搜索列表并确定3.5介于3和4之间的最有效方法是什么? 我有一个适用于整数的方法/作弊(暂时将目标键插入列表然后找到索引)但我想我会问专业人员所以我可以生成高质量的代码。 谢谢。

使用具体类型而不是界面是否更好的性能?

我已经遇到一些规则(建议)使用具体的List和Dictionary而不是IList和IDictionary ,因为示例测试显示通过接口访问速度相当慢。 例如,向列表中添加10000个值然后在列表上执行10亿次Count表明,通过接口执行此操作比通过具体类执行它慢28倍。 即,通过具体类需要80ms,通过界面需要2800ms,这表明它通过界面的速度非常慢。 鉴于此,使用具体类是合理的。 有没有理由说接口这么慢? (可能更多的是针对那些了解更多关于.net内部的人)。

结构内存破解重叠对象引用 – 是否可能?

我猜这个问题的答案是“这是不可能的,切换到C ++”。 但我还以为我会把它扔出去。 我正在处理一个巨大的二叉树。 我有一个结构数组来表示我在迭代树时用来帮助处理内存的分支节点。 为了节省一点内存,从而改善缓存局部性,我正在考虑重叠叶节点的对象引用。 该对象引用将指向所有叶数据。 基本上,这样的事情: [StructLayout(LayoutKind.Explicit)] struct BranchData { [FieldOffset(0)] // 1 byte internal byte SplitIndex; [FieldOffset(1)] // 4 bytes internal float SplitValue; [FieldOffset(5)] // 4 bytes internal int LowIndex; [FieldOffset(9)] // 4 bytes internal int HighIndex; [FieldOffset(0)] // 8 bytes (We’re working with x64 here) internal LeafData Node; } 以上给出了以下运行时错误 无法从程序集“WindowsFormsApplication1,Version […]