Tag: performance

不安全的每像素访问,30毫秒访问1756000像素

所以我一直在我的网站上分享关于上述主题标题的一些想法,关于快速,不安全的像素访问。 一位先生给了我一个粗略的例子,说明他是如何用C ++做的,但这对C#没有帮助,除非我可以互操作,而且互操作也很快。 我在互联网上找到了一个使用MSDN帮助编写的课程,以便不安全地访问像素。 这门课速度非常快,但速度不够快。 这是class级: using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing.Imaging; namespace DCOMProductions.Desktop.ScreenViewer { public unsafe class UnsafeBitmap { Bitmap bitmap; // three elements used for MakeGreyUnsafe int width; BitmapData bitmapData = null; Byte* pBase = null; public UnsafeBitmap(Bitmap bitmap) { this.bitmap = new Bitmap(bitmap); } public UnsafeBitmap(int width, int […]

SqlDataReader vs SqlDataAdapter:哪一个具有更好的返回DataTable的性能?

我想知道哪一个具有更好的性能来返回DataTable 。 这里为SqlDataReader我使用DataTable.Load(dr) 使用SqlDataReader : public static DataTable populateUsingDataReader(string myQuery) { DataTable dt = new DataTable(); using (SqlConnection con = new SqlConnection(constring)) { SqlCommand cmd = new SqlCommand(myQuery, con); con.Open(); SqlDataReader dr = null; dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); if (dr.HasRows) { dt.Load(dr); } return dt; } } 使用SqlDataAdapter : public DataTable populateUsingDataAdapter(string myQuery) { SqlDataAdapter dap […]

使用WPF绘制数千个数据点的最佳方式?

我写了一个显示财务数据的图表。 当我使用PathGeometry以及PathFigure和LineSegment绘制不到10.000个点作为连接线时,性能很好。 但是现在我需要同时显示多达100.000点(没有滚动)并且已经非常慢,只有50.000点。 我在考虑StreamGeometry ,但我不确定,因为它与PathGeometry基本相同,它将信息作为字节流进行处理。 有没有人有想法让这更高效,或者有人甚至做过类似的事情? 编辑:这些数据点一旦绘制就不会改变,所以如果有潜在的优化,请告诉我(线段现在被冻结)。 编辑:我试过StreamGeometry。 由于某些原因,创建图形的时间更长,但这不是问题。 绘制所有点后在图表上绘制仍然与前一个方法一样慢。 我认为WPF处理的数据点太多了。 编辑:我已经进行了一些实验,我注意到通过将先前为double的坐标转换为int来改善性能,以防止WPF抗锯齿子像素线。 编辑:感谢所有建议减少线段数的回复。 对于阶梯线,我将它们降低到最多两倍的水平分辨率,对于简单的线条,最多将它们降低到水平分辨率,现在性能非常好。

log4net BufferingForwardingAppender性能问题

编辑2:我已经解决了问题(请参阅下面的答案)请注意,该问题可能会影响所有使用BufferingForwardingAppender修饰的appender以及从BufferingAppenderSkeletoninheritance的所有appender(分别为:AdoNetAppender,RemotingAppender,SmtpAppender和SmtpPickupDirAppender)* 我正在做一些非常基本的log4net工作台,我试图用BufferingForwardingAppender修饰RollingFileAppender。 我通过BufferingForwardingAppender而不是直接通过RollingFileAppender遇到了糟糕的性能,我真的没有理由。 这是我的配置: 这是基准(非常简单的代码): var stopWatch = new Stopwatch(); stopWatch.Start(); for (int i = 0; i < 100000; i++) { Log.Debug("Hello"); } stopWatch.Stop(); Console.WriteLine("Done in {0} ms", stopWatch.ElapsedMilliseconds); 直接通过RollingFileAppender输出的是: 完成时间为511毫秒 而通过BufferingForwardingAppender装饰RollingFileAppender: 签订于14261毫秒 这大约慢了30倍。 我认为通过在将它们写入文件之前缓冲一定量的日志来获得一些速度,但是由于某种原因它会使事情变得更糟。 在我看来配置是好的,所以这真的很奇怪。 有人知道吗? 谢谢! 编辑1: 通过包装/装饰FileAppender甚至是ConsoleAppender,行为是完全相同的(在log4net官方配置示例中仍然有一个基本的BufferingForwardingAppender包装/装饰ConsoleAppender的例子..并没有具体提到处理性能)。 经过一些调查/分析后,我可以看到大部分时间都在BufferingForwardingAppender中被破坏,更具体地说是在调用WindowsIdentity.GetCurrent()…被调用时我们调用Log.Debug() 。在上一个样本中(上面的示例源中100K次)。 已知对此方法的调用非常昂贵,应该避免或最小化,我真的不明白为什么它会被调用每个日志事件。 我真的完全错误地配置了某些东西/没有看到明显的东西,或者某种错误是某种错误,这就是我现在想要解决的问题…… 部分调用堆栈是: AppenderSkeleton.DoAppend BufferingAppenderSkeleton.Append LoggingEvent.FixVolatileData LoggingEvent.get_UserName() 调用get_LocationInformation()也在FixVolatileData中完成,也会导致高性能(每次捕获堆栈跟踪)。 我现在试图理解为什么这个极其昂贵的FixVolatileData调用(至少对于修复问题)在这个上下文中发生的每个日志事件,而直接通过包装的appender(直接通过ConsoleAppender / FileAppender ..)不会执行这种操作。 即将到来的更新,除非有人得到了所有这些的答案;) […]

LinqToExcel加载字典

我有以下解决方案但不太优雅。 如果可能的话,我想用ToDictionary来解决这个问题。 谢谢你的帮助,因为我很新。 var excel = new ExcelQueryFactory(@”E:\MAHipotCepaStationProgram.xlsx”); //get list of program names List testNames = new List(); testNames.AddRange(excel.Worksheet().ToList() .Where(s => s[“Program #”].Value.ToString() == “Program Title”) .Select(s => s[1].Value.ToString())); //get list of program numbers List testNumbers = new List(); testNumbers.AddRange(excel.Worksheet().ToList() .Where(s => s[“Program #”].Value.ToString() == “Program #”) .Select(s => Convert.ToInt32(s[1].Value))); //combine them Dictionary programs = […]

C#中的通用接口是否可以阻止拳击? (.NET vs Mono性能)

我有一个C#接口,其中某些方法参数声明为object类型。 但是,传递的实际类型可能因实现接口的类而异: public interface IMyInterface { void MyMethod(object arg); } public class MyClass1 : IMyInterface { public void MyMethod(object arg) { MyObject obj = (MyObject) arg; // do something with obj… } } public class MyClass2 : IMyInterface { public void MyMethod(object arg) { byte[] obj = (byte[]) arg; // do something with obj… } […]

使用include不会改变行为

有人可以帮我澄清之间的区别: var query = awlt.People.Include(p => p.EmailAddresses) .Where(p => p.LastName.Equals(lastName)) .SelectMany(a => a.EmailAddresses) .Select(a => a.EmailAddress1); var query = awlt.People .Where(p => p.LastName.Equals(lastName)) .SelectMany(a => a.EmailAddresses) .Select(a => a.EmailAddress1); 在两种情况下我都得到相同的结果而不知道差异。 Eager Loading是否需要使用Include ?

如何将多个方法(带参数)作为参数传递?

假设我有以下WCF代码: try { ServiceClient proxy = new ServiceClient(); proxy.ClientCredentials.UserName.UserName = “user”; proxy.ClientCredentials.UserName.Password = “password”; proxy.GetData(2); if (proxy.State = CommunicationState.Opened) { proxy.GetData(“data”); } proxy.Close(); } catch (FaultException ex) { // handle the exception } 而且由于我注意到try … catch和其他逻辑是重复的,更不用说设置WCF调用是昂贵的,我想向这个函数发送许多“方法和参数”。 实质上将GetData(2)和GetData(“data”)作为方法数组传递,并使结果异步或同步返回。 我怎么做到这一点? 我想我可以有两个’ref’对象来处理结果[]和对结果[]的共享锁。 但是我不确定如何将“带参数的方法”作为参数传递给另一个函数。 也许另一种看待它的方法可能是一个函数指针数组,使用不同的参数来表示相同的函数。 任何人都可以推动我做正确的方法吗? 更多信息: 我问这个问题所以我可以优化这种方法来处理WCFexception和重试,但所以我不必总是在每次调用后打开/关闭客户端。

LINQ vs foreach vs性能测试结果

有人可以解释这些结果吗? 我知道有一些重复的问题,但我还没有找到一个与我的结果得出相同结论的问题:o using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SpeedTest { class Person { public Person(string name) { this.Name = name; } public string Name { get; set; } } class Program { static void Main(string[] args) { var people = new List(); AddTwins(“FRANCISCO”, people); var stopwatch = new […]

这两种算法之间是否存在改变IEnumerable的性能差异?

这两个问题给出了改组IEnumerable的类似算法: C#:使用Random和OrderBy是一个很好的shuffle算法吗? 你可以在C#中乱序列举一个集合吗? 以下是两种方法并排: public static IEnumerable Shuffle1 (this IEnumerable source) { Random random = new Random (); T [] copy = source.ToArray (); for (int i = copy.Length – 1; i >= 0; i–) { int index = random.Next (i + 1); yield return copy [index]; copy [index] = copy [i]; } } public […]