乐趣区

关于葡萄城控件:2020中国-NET开发者大会精彩回顾葡萄城高性能表格技术解读

12 月 19 日,2020 中国 .NET 开发者大会在苏州召开。本次会议以“开源、共享、翻新”为主题,联合线下、线上实时同步直播的形式,征集了来自微软、龙芯等知名企业的 40 余位技术大咖,为 50 余万名开发者带来了近 50 场技术讲座和 .NET 利用实际。

葡萄城的表格技术负责人王鸿学生,有幸作为本次大会的演讲嘉宾,向在场的 .NET 开发者分享了葡萄城高性能表格技术调优方面的教训积攒。

王鸿,作为葡萄城表格技术的负责人,自 2014 年起,便始终聚焦于企业高性能表格技术畛域的钻研,为葡萄城设计了全新的表格组件架构,并率领研发团队推出了一款性能在业界当先的电子表格组件 GcExcel, 积攒了大量高并发、高可用性表格组件的架构设计教训。

在本次分享中,王鸿从葡萄城研发电子表格组件的背景与初衷登程,具体比照了 Excel 与原生 C# 代码的读取性能差别,并总结了若干针对 prototype 原型进行性能调优的伎俩,如缩小垃圾回收的影响、共享对象晋升性能、压缩数据升高内存、充分利用高速缓存等形式。

以下是王鸿老师的次要分享内容:

1\. 葡萄城研发电子表格组件的背景与初衷

早在 30 多年前,电子表格就曾经作为办公软件中的一个根底性能套件,首次呈现在个人电脑中。近些年,随着网络信息化的进一步增强,电子表格的利用越来越宽泛和深刻。

现在“表格”也曾经成为数据的一种重要表现形式,广泛应用于各类桌面软件、利用零碎和 SaaS 平台的存储构造、零碎形成中。人们曾经习惯应用表格工具来解决财税、金融、证券、保险、工业制作、物流仓储等行业的大规模数据,其中典型代表包含微软的 Excel、谷歌的 Spreadsheet,以及 WPS 等。

葡萄城,作为寰球当先的开发技术提供商,很早便投入了研发精力,开辟并摸索如何将电子表格以组件的形式嵌入到各类零碎中。通过近 30 年的钻研,葡萄城的表格技术曾经实现了在保留用户 Excel 应用习惯的同时,也能基于用户的教训和积攒在业务零碎中提供高效的数据处理和可视化能力。

2\. 通过 C# 代码,测试 Excel 文件读取的极限性能

电子表格的利用场景个别都较为简单,开发实现它们会碰到很多技术难点,其中最为典型的便是性能问题。

葡萄城为实现高性能的表格组件,克服了很多性能挑战:如怎么疾速关上和保留一个电子表格文件、如何计算海量的公式函数、如何让用户疾速实现大量单元格的值和款式设置等。

为了测试 C# 代码对 Excel 文件的读取性能,王鸿老师选取了一个日常生活中很容易碰到的场景:当一个电子表格文件很大的时候(蕴含 30 列、1,000,000 行、30,000,000 个单元格数据),用 Excel 关上它须要期待 34 秒。

如果用户想要用更短的工夫关上这样的大文件时,有没有方法实现呢?答案是有,通过测试,用葡萄城的表格组件 GcExcel 关上这样一份文件,仅需 12 秒。

3\. 葡萄城表格技术优化:缩小垃圾回收的影响

从 Office 2007 开始,Excel 文件就是一个规范的 Zip 文件,对其解压后,找到一个名为“Worksheets”的文件夹,在其中的“sheet1.xml”文件中,寄存了每个 Excel 文件单元格对应的地位和值。

如何通过更高效的算法取出这些地位和值,便是葡萄城表格技术的优化方向。对于一段未经优化的 C# 代码而言,把每个单元格的值读出来,寄存在一个 List 中,须要 27 秒。在这里,咱们仅仅将代码中的 object 改为 double,就能够让其在 20 秒实现。

这 7 秒差距,便是因为垃圾回收带来的影响。在 List 中有太多的 object 对象,这消耗了大量的垃圾回收工夫,只管它没有被回收掉,但因为它们是 object,所以在垃圾回收的过程中,须要一直的检测它们是否能够回收,将 object 改为 double,垃圾回收的工夫便能够忽略不计。

葡萄城表格技术如何克服垃圾回收的影响?

  1. 打消单元格概念。因为单元格的数量太多了,保留这个概念就很难把 object 的数量降得很低。葡萄城把原来在单元格类型里得数据离开解决,把款式剔除进来另外解决,这里只思考单元格值。电子表格中单元格的值可能有四种类型:数字、文本、布尔和谬误,数字在外部都是用 double 类型来示意,布尔和谬误也能够用 double 来存储。对于文本,不能用惯例办法存储,但咱们能够想一个方法,让 double 也能够存文本,这个前面具体讲。总之,用 double 能够存储所有的 Excel 数据,这样咱们就能够设计一个简略单元格的数据对象,它是一个构造体,不是 object。
  2. 行存储改成列存储。电子表格行的数量最大为 2 的 20 次方(约 1048576),而列的数量最大为 2 的 14 次方(约 16384),所以把行存储改成列存储,能够缩小对象的数量。利用 C# 的泛型,让字典中存储值类型数据。通过这样一革新,object 的数量会从九千多万降落到一万多,垃圾回收的影响根本忽略不计。

4\. 葡萄城表格技术优化:共享存储及款式压缩

所谓共享存储,就是把整个软件中独特的对象只生成一份,放在一个全局的中央,每个对象用一个数字做 ID,其它中央中央只存这个 ID。以上面的文本为例,所有的文本集中存储在一个表中,每个文本有一个惟一的 ID,单元格中只存储这个 ID。

共享存储有很多长处,对升高内存和晋升性能有非常明显的作用:

  1. 升高内存耗费。对一个数据量很大的软件,会有很多数据都是反复的,比方电子表格中,如果文本的数量很大,那么反复率就十分高,把这些文本集中存储,雷同的只存一份,你会发现,不同的文本数量其实很少,这会极大升高内存耗费。
  2. 晋升性能。以对字符串做查找、替换为例,如果没有共享集中存储,必须要扫描所有的单元,对每一个单元格文本都做一次比拟操作。但有了共享存储,就只须要查找“字典”就能够了;在字符串比拟时,只须要比拟数字是否相等就能够了;在排序等操作中,只需先把表中的字符串建设一个索引,排好序,前面须要时利用这个索引就能够了。

通过共享存储,葡萄城表格技术曾经把内存的耗费升高了很多,但咱们还能够进一步优化。大家察看这个图,咱们在每一个单元格存储了一个数字,指向全局样式表的一格款式对象。但咱们发现,这些数字的反复率很高,因为电子表格中,一片区域的款式往往是一样的,针对这个特点,咱们很容易就想到一个优化的办法。

咱们不须要在每个单元格中存储一个数字,而是建设图上这样一个表,表的一栏记录一个区域(一个矩形),另一栏记录这个区域对应的款式的 ID,通过这样的形式,咱们又能够把款式的存储空间升高很多。极其一点讲,如果整个工作表都是同一种款式,那么咱们这里只须要存储一个矩形和一个数字。

5\. 葡萄城表格技术优化:充分利用高速缓存

当初的 CPU 都有高速缓存,它能晋升 CPU 解决数据的性能。这个图展现了不同存储介质和 CPU 的关系:越高速的存储介质离 CPU 更近,速度越快、空间更小、价格越贵。

CPU 在读取数据的时候,先从最近的缓存中读,只有没命中,才从下一级缓存中读。因而,晋升缓存命中率对改善性能意义重大。

同时,咱们还要分明,当数据从较慢的存储介质往较快的存储介质复制时,不是顺次进行,而是一块一块的复制,也就是说,当咱们拜访内存中某一个数据时,它四周相邻的数据也一起读入了离 CPU 最近的高速缓存。因而,如果下一个时刻就读相邻的数据,便能够间接在缓存中找到,读取速度就会十分快。

晓得了高速缓存的原理,如何编写缓存敌对的代码?

· 在组件设计的时候,抉择什么样的数据结构得留神,比方数组和字典,受缓存的影响可能不一样。

· 在拜访数据的时候,要留神数据的存储形式。

6\. 葡萄城表格技术优化:其余实际

除了上述优化办法,葡萄城的表格技术还有更多优化实际。如创立 Cache、应用基于汇合的操作运算、利用 SIMD 计算大量数据等。

以上就是王鸿老师分享的次要内容,通过一个个鲜活的示例代码 + 工夫比照,也让大家对葡萄城高性能的表格技术造成了十分粗浅的意识。

于此同时,王鸿老师在大会上分享的高性能表格技术,均曾经实现落地。在前端,纯前端表格控件 SpreadJS 可针对 Excel、Grid 数据进行在线编辑、计算和展现;在后端,服务端表格组件 GrapeCity Documents for Excel(简称:GcExcel)可批量解决 Excel 文档,执行更高效的导出与打印。

退出移动版