Tag: 性能

了解多媒体计时器的奇怪行为

我在我的应用程序(C#.NET)中使用多媒体计时器来提高计时器的准确度并达到1 ms的计时器频率。 到目前为止,我的应用程序一直运行良好,直到最近它开始表现得很奇怪。 我试图了解我的申请有什么问题。 以下是采取的步骤 定时器频率设置为1 ms,每1ms调用一次回叫 有4个线程,每个线程创建自己的计时器对象。 它们都设置为在1ms后调用回调。 这些是个别实例,不共享。 旧的代码执行时间约为0.3毫秒。 这个工作正常,直到下一步。 应用程序代码已更改。 定时器回调函数现在需要大约1.2 ms才能执行。 这显然是个问题。 (我将在稍后优化代码。但现在我只想了解多媒体计时器行为) 只有第一个线程正在调用定时器回调,而对于其他线程,回调只被调用两次或三次,之后永远不会调用回调。 看起来对于其他线程,计时器甚至错过了(?),它无法赶上。 (它错过了每次中断)。 你能解释一下计时器对象的行为吗? 所有线程实际上都指向同一个计时器对象,因为它只有一个进程吗? 为什么其他线程没有调用定时器回调?

将持久的ADO 2.8 COM记录集转换为ADO.Net DataSet

我有一个VB6应用程序,我转换为.net。 我正在分阶段这样做,所以客户端将同时具有VB6和.net应用程序。 部分应用程序将ADO 2.8 COM记录集缓存到SQL Server中的表,并根据需要检索它们。 .net应用程序使用相同的持久记录集。 我有c#代码检索持久化记录集并将其转换为数据集。 我的问题是 – 我是否以最有效的方式做到了? 这是我从数据库中检索记录集的代码 – Stream adoStream = null; SqlParameter cmdParameter; SqlCommand cmd = null; SqlDataReader dr = null; string cmdText; int bytesReturned; int chunkSize = 65536; int offSet = 0; UnicodeEncoding readBytes; try { cmdParameter = new SqlParameter(parameterName, idParamter); cmdText = sqlString; cmd = new SqlCommand(); […]

Membership.ValidateUser很慢

我正在使用System.Web.Sercurity.Membership方法来处理我们的Web服务的用户。 我在测试期间非常满意,因为我们的数据库和Web服务驻留在同一台服务器上。 当数据库和Web服务移动到单独的服务器时,当我们使用Membership.ValidateUser(username, password)命令对用户进行身份validation时,我们会遇到大量延迟。 配置文件详细信息: type=”System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=*********” connectionStringName=”BlaBlaConnection” enablePasswordRetrieval=”false” enablePasswordReset=”true” RequiresQuestionAndAnswer=”false” requiresUniqueEmail=”false” maxInvalidPasswordAttempts=”5″ minRequiredPasswordLength=”6″ minRequiredNonalphanumericCharacters=”0″ passwordAttemptWindow=”10″ applicationName=”/”

用于在Windows上创建快速,现代和响应式GUI的C ++ / CLI或C#

目前我分为这两种语言。 我几乎已经编程了当前应用程序的一半,这需要非常快。 它可以在多种负载条件下计算任何类型的绝缘玻璃结构。 我只是不知道它是否是用C ++ / CLI编写它的正确选择。 例如,在互联网上,我甚至从未读过“C ++ / CLI”的名称,但每个人都建议学习C#。 C ++ / CLI的真正缺点是什么? 我从阅读中得知,未来几年它注定会被弃用。 这是真的? 如果有一些,它们是如此糟糕,真的有必要切换到C#? 目前针对C#的唯一一件事就是我有C代码需要访问,而且由于安全问题和黑客攻击,我无法创建.Dll。 (该计划将非常昂贵) 为了编写在Windows上运行的快速GUI(还有3D动画和多核甚至图形核心处理),我还有什么其他机会?

从Texture2D创建UI图像

我正在开发一个实时流应用程序,它接收JPEG图像作为字节数组,并使用UI.Image其显示在屏幕上。 它工作正常,但我正在进行优化 ,几乎没有问题 。 目前,我在下面的代码将字节数组转换为Texture2D然后从Texture2D 创建一个Sprite ,然后将该Sprite分配给UI.Iamge以在屏幕上显示。 Texture2D camTexture; Image screenDisplay; public byte[] JPEG_VIDEO_STREAM; bool updateScreen = false; //初始化 JPEG_VIDEO_STREAM = new byte[20000]; camTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false); //在Update函数中运行的主代码 if(updateScreen){ camTexture.LoadImage(JPEG_VIDEO_STREAM); Sprite tempSprite = Sprite.Create(camTexture, new Rect(0, 0, camTexture.width, camTexture.height), Vector2.zero, 0); screenDisplay.sprite = tempSprite; updateScreen = false; } 上面的代码目前只执行3个步骤来显示图像到屏幕。 byte array – […]

频繁插入已排序的集合

我已经对集合(List)进行了排序,我需要始终对其进行排序。 我目前正在我的集合上使用List.BinarySearch,然后在正确的位置插入元素。 我也尝试过每次插入后排序列表,但性能不可接受。 有没有可以提供更好性能的解决方案? 也许我应该使用其他collections品。 (我知道SortedList但它仅限于唯一键)

我可以检查子序列是否比O(n * n)更快

所以我的问题是主题的名称。 是否存在一种算法,该算法检查B是否是A的子序列,比O(N ^ 2)更快,例如O(NlogN)还是简单的O(N)? 找到的方法就是简单的残酷 for(int i = 0; i < a.Length – b.Length; i++) { if (IsSubsequence(a,b,i)) return i; } return -1;

更高效的数据库访问

我是数据库和linq的新手,所以我的问题可能被认为是微不足道的。 我目前在每个类中启动所有数据库请求: DataClassesDataContext db = new DataClassesDataContext() 然后我继续在方法中做出我需要的任何linq请求,并继续使用主应用程序逻辑。 现在,两个有趣的查询: 1)我相信我已经看到人们在’使用’中包含数据库使用。 如: using (DataClassesDataContext db = new DataClassesDataContext()) { … } 如果这是正确的,那么这不是说我的类不能再使用成员’db’变量了,而是需要在每个函数调用中进行那些db请求吗? 另外,如果我不在通话中使用’使用’,究竟会发生什么? 2)在启用SQL事件探查器的情况下运行我的应用程序,我看到许多连接打开和关闭。 这是否意味着每个DataClassesDataContext调用都会建立一个单独的连接? 它看起来效率低下,在实际使用的每个类中实际使DataClassesDataContext对象成为静态的正确方法是什么?

为什么拆箱比拳击快100倍

为什么装箱和拆箱操作之间的速度变化如此之大? 有10倍的差异。 我们什么时候应该关心这个? 上周,Azure支持人员告诉我们,我们的应用程序的堆内存存在问题。 我很想知道它是否与装箱拆箱问题有关。 using System; using System.Diagnostics; namespace ConsoleBoxing { class Program { static void Main(string[] args) { Console.WriteLine(“Program started”); var elapsed = Boxing(); Unboxing(elapsed); Console.WriteLine(“Program ended”); Console.Read(); } private static void Unboxing(double boxingtime) { Stopwatch s = new Stopwatch(); s.Start(); for (int i = 0; i < 1000000; i++) { int a […]

测量定时器的精度(例如秒表/ QueryPerformanceCounter)

鉴于C#中的Stopwatch类可以使用类似下面三个不同计时器的东西 系统定时器,例如精度约为+-10 ms具体取决于可通过timeBeginPeriod设置的定时器分辨率,约为+-1 ms 。 时间戳计数器(TSC)例如,滴答频率为2.5MHz或1滴= 400 ns因此理想情况下是精确度。 高精度事件定时器(HPET),例如,滴答频率为25MHz或1滴= 40 ns因此理想情况下是精确度。 我们如何衡量这种可观察的精度? 精度被定义为 精度是指两次或多次测量彼此的接近程度。 现在,如果Stopwatch使用HPET,这是否意味着我们可以使用Stopwatch来测量与定时器频率相当的精度? 我不这么认为,因为这要求我们能够使用零差异或完全固定开销的计时器,据我所知,对于Stopwatch来说并非如此。 例如,使用HPET并调用时: var before_ticks = Stopwatch.GetTimestamp(); var after_ticks = Stopwatch.GetTimestamp(); var diff_ticks = after_ticks – before_ticks; 那么diff会说大约100 ticks或4000 ns ,它也会有一些变化。 那么如何通过实验测量Stopwatch的可观测精度呢? 所以它支持下面所有可能的定时器模式。 我的想法是搜索最小数量的刻度!= 0,首先建立Stopwatch的开销,用于系统计时器,这将是0,直到例如10ms ,即10 * 1000 * 10 = 100,000个刻度,因为系统计时器的刻度分辨率为100ns ,但精度远非如此。 对于HPET,它永远不会为0,因为调用Stopwatch.GetTimestamp()的开销高于计时器的频率。 但这并没有说明我们使用计时器测量的精确程度。 我的定义是我们可以可靠地测量的差异有多小。 可以通过测量不同的迭代次数ala来执行搜索: var before = Stopwatch.GetTimestamp(); […]