Performance Optimizing


优化MATLAB读取数据的速度

有个C#程序每天实时落地了一些股票行情数据,为节省存储空间,数据是以二进制文件的方式存储的。现在要将这些数据提供给研究人员的MATLAB使用,需要编写一个C#的dll供MATLAB调用。 先说一下实时行情的格式。目前只需要用到存储数据里的,股票代码,涨停价,跌停价,最新价,时间,成交量,成交额,买一至买十的价格和数量,卖一到卖十的价格和数量这些信息,行情从9:25~15:00大概每3秒一条记录。 ↑ 典型的行情界面,上图里盘口只有5档,因为10档要钱😂 在C#里面,可以定义一个MarketData对象,表示某一时刻的行情,行情里面包含股票代码,买卖十档的价格和数量等等,MarketData 如下图,只列出了部分字段: public class MarketData { public string Symbol;//代码 …


推荐文章

写了一些文章,有一些自己比较满意,这些都是以系列的方式写的;还有一些写的比较随意,有凑数的嫌疑😂 (就像现在很多智能手机有很多摄像头一样,凑数的四摄🤣),这里列出自己相对比较满意的文章,方便查看。 1.Excel开发系列 这个是我当年在某财经公司做Office插件开发时的一些新得和总结,毫不谦虚的说,大概是目前网上关于Office插件开发比较全的文章,这方面资料比较少,这些文章是在工作中跟同事以及在网上不断查找探索的总结。总共写了十一篇。 浅谈Excel开发:一 Excel 开发概述 浅谈Excel开发:二 Excel 菜单系统 浅谈Excel开发:三 Excel 对象模型 浅谈Excel开发:四 Excel 自定义函数 浅谈Excel开发:五 Excel RTD函数 浅谈Excel开发:六 Excel 异步自定义函数 浅谈Excel开发: …


LINQ Group By操作

在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下: 上表是所有政区,商圈中的餐饮个数,名为FoodDistrict 下表是所有政区,商圈中的SPA个数,名为SPADistrict 现在要把这两张表,根据政区和商圈合并,然后相加Counts,根据Counts的总大小排序,统计热门商圈和热门政区。 在这里仅讨论合并的问题,以演示在SQLServer和C#中LINQ的实现方法: 通常,我们可以直接通过在SQLServer里面首先通过Union All,然后再通过GroupBy语句来执行查询操作即可满足要求,过程如下: SELECT d.CityLocationId , d.CityLocationName , d. …


BCL中String.Join的实现

在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况。比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的字符串,然后作为in的语句传进去。所以自然而然,可以通过循环的方式来拼着个字符串,于是可以写一个下面这样的通用方法: private static string GetStringFromList<T>(char seperator, IEnumerable<T> values) { if (seperator == null) return string.Empty; if (values == null || values.Count() == 0) throw new …


.NET应用程序与数据库交互的若干问题

我们知道,在应用程序中与数据库进行交互是一个比较耗时的过程,首先应用程序需要与应用程序建立连接,然后将请求发送到数据库,数据库执行操作,然后将结果集返回。所以在程序中,要尽量晚的与数据库建立连接,并且较早的释放连接。 然而在很多时候,我们需要频繁的查询和更新数据库中的记录,比如我们的一张表中有1000条记录,假设有一个场景,需要一条一条的判断这1000条记录,如果不存在,插入;如果存在,更新某一个字段。这种场景很常见,比如银行的用户转账或者汇款,在完成之后需要更新账户余额等操作。 最近项目中也遇到了类似的情况,通过实践也简单总结了一些如何提高应用程序执行效率的方法,当然这些都是通过减少和数据库进行交互以及当数据达到一定程度,通过批量实现的。下面就简要介绍一下。 一 场景 最近在项目中要实现一个类似大众点评团购这种筛选的功能,用户可以根据系统提供的城市,商区,美食类别列表来进行筛选, …


.NET程序的性能要领和优化建议

前几天在老赵的博客上看到,Bill Chiles (Roslyn 编译器的Program Manager)写了一篇文章叫做《Essential Performance Facts and .NET Framework Tips》。这篇文章是一个14页的pdf,当时我是在地铁上在Lumia手机上看的,觉得很是不错,这里也建议大家直接下载阅读原文,我这里试着翻译一下,以加深自己印象,后面也有一些思考,以下是原文内容: --------------------------------------------------------------------------- 本文提供了一些性能优化的建议,这些经验来自于使用托管代码重写C# 和 VB编译器,并以编写C# 编译器中的一些真实场景作为例子来展示这些优化经验。.NET 平台开发应用程序具有极高的生产力。.NET 平台上强大安全的编程语言以 …


浅谈并发与并行(二)

上文讲解了.NET中的采用Task可以实现任务的并行。除了任务的并行之外,还有数据的并行。和任务的并行不同,数据的并行是指并行的源头不是算法的代码,而是算法操作的数据的本身,TPL (Task Parallel Library)中提供了几个数据并行的API. 一 数据的并行 1.1 Parallel.For和Parallel.ForEach for 和foreach语句也适合进行并行化。实际上,随着并行计算的流行,对这种循环遍历进行并行化也有过很多种尝试。这些方法包括对在编程语言进行扩充等,比如C++里面的OpenMP标准。C#并行类库(Task Parallel Library, TPL)通过提供一些API实现了数据并行化功能,这就是Parallel.For和Parallel.ForEach方法,分别对应平常用到的for和foreach。 回到上文中的遍历数 …


DataTable数据检索的性能分析

我们知道在.NET平台上有很多种数据存储,检索解决方案-ADO.NET Entity Framework,ASP.NET Dynamic Data,XML, NHibernate,LINQ to SQL 等等,但是由于一些原因,如平台限制,比如说必须基于.NET Framework2.0及以下平台;遗留的或者第三方数据接口采用的就是DataTable等等,仍然需要使用DataTable作为数据存储结构。另一方面DataTable比较容易使用,一些数据访问的接口可能直接采用了DataTable结构。在使用DataTable进行数据检索的时候,有一些需要注意的地方,这些地方会严重的影响对数据的检索效率。 本人最近工作中需要对大量的DataTable进行拼接。接口的数据是以DataSet然后里面放DataTable的方式提供的,暂不提是否合理,同时进行多个请求的时,服务端会返回 …


.NET中使用P/Invoke 导致内存已损坏异常的一则解决方法

一 问题重现 前面在减少.NET内存占用的一则实践中,和大家分享了在.NET中使用P/Invoke技术来调用C++编写的非托管代码的例子。虽然性能和内存占用还不错,但是在随后而来的几周里,在某些同事的机器上总是偶尔会出现异常导致应用程序突然崩溃,尤其是在一些配置比较好的机器上。于是完善了一下日志记录,捕捉到最多的异常是: “Attempted to read or write protected memory. This is often an indication that other memory is corrupt.” 然后调试的时候无法跟进去,直接抛出如下的异常: 根据这个异常实在查找不出任何有意义的信息,不过结合这两者很明显的知道,问题出在调用的非托管的代码里面。 二 解决方法 根据之前提示的问题, …


减少.NET应用程序内存占用的一则实践

最近一周比较忙,主要的工作内容是在做一个叫“键盘精灵”的东西,简单来讲就是将很多数据放到内存中,对这些数据进行快速检索,然后找出根据输入条件最匹配的10条记录并予以展示。具体和下面两款炒股软件的相关功能类似: 数据以文本形式存在文件中,且数据量较大,有近20万条,每一条记录有几个字段,以分隔符分割。当时使用的是6万条记录的测试数据,文本文件将近10M,这个模块加载到内存并建立缓存之后,大概会占用将近70-80M的内存。自我接手以后,主要的任务就是降低内存消耗和提高匹配效率。 一、避免创建不必要的对象 拿到代码后,第一步就是看设计文档,然后断点一步一步的看代码,大概明白了逻辑之后,发现思路有一些问题。之前的代码处理流程思路大概是下面这样的: 将文件读取到内存,实例化 根据条件对文件进行检索,并存储到结果集1中 对结果集 …


浅析.NET中的引用类型和值类型(下)

上一篇文章中简单讲了.NET中值类型和引用类型的区别,并分析了引用类型的内存布局和实现方式,并在开始的例子中简单分析了值类型相较于引用类型的若干优点。在平常的开发中,很多人一上来就用class,而很少去想到底该用class还是struct。本文详细介绍.NET中的值类型以及在使用中应该注意的问题。在某些情况下,使用值类型较引用类型可以显著减少内存占用和GC压力,提高程序的执行效率。本文参考《Pro .NET Performance》 《CLR Via C#》和 《Advanced .NET Debugging》,希望对您有帮助。 值类型内部实现 和引用类型相比,值类型具有相对简单的内存布局,但是这种简单的布局也引入了一些限制,尤其是在要将值类型“当做”引用类型使用的时候需要进行装箱操作。 上篇文章提到,使用值类型最主要的原因是:值类型具 …