aardio 文档

dotNet.ReoGrid 扩展库 - 性能优化

快速和轻量级一直是 ReoGrid 的开发目标。即使现在已经支持许多功能,ReoGrid 仍然采用多种技术来优化性能并提升用户体验。

aardio 调用 ReoGrid 性能优化

ReoGrid 是一个 .NET 组件。 在 aardio 中调用 .NET 很方便,ReoGrid 官方文档中的 C# 示例我们几乎不需要太多修改就可以直接将其用于 aardio 。

但是我们需要了解 aardio 调用 .NET 这中间要经过跨语言的接口交互,当然这过程依然很快,但如何在循环中大量、快速、密集调用,积少成多可能就会影响到程序性能。

例如下面这样循环写入大量数据将会非常慢:

//快速扩展行数
var sheet1 = grid.CurrentWorksheet; 
sheet1.Rows = 100000; // 扩展到10万行

//循环写数据
for(i=1;100000;1){
    sheet1.SetCellData(i-1, 0, "数据"+i);
}

优化的方法其实非常简单,我们应当在 aardio 中处理数据,再用数组一次性传给表格,那么即使写入上万行,速度也会快如闪电。

优化后的 aardio 代码如下

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio 调用 ReoGrid 性能优化演示")
/*}}*/

import dotNet.ReoGrid;
var grid = ReoGrid.ReoGridControl(winform);
var sheet1 = grid.CurrentWorksheet;

// 快速扩展到10万行
sheet1.Rows = 100000; 

var data = []
for(i=1;100000;1){
    table.push(data,"数据"+i); 
}

// 定义范围:A1:A100000 参数 (起始行, 起始列, 行数, 列数)
var rangePos = ReoGrid.RangePosition(0, 0, 100000, 1);  
sheet1.SetRangeData(rangePos, data);

//也可以用下标直接赋值
//sheet1[rangePos] = data;

// 固定单元格到 C6 (冻结单元格)
sheet1.FreezeToCell(5, 2); 

winform.show();
win.loopMessage();

可以通过下标直接赋值,例如 sheet1[rangePos] = data 。不过使用 sheet1[rangePos] 获取值时返回的是 System.Object 数组,需要用 sheet1[rangePos].Value 解包为纯 aardio 数组

所以这个的关键不是优化 ReoGrid 控件本身的速度,其实它已经很快了,而是要调整写程序的思路。

这就好比要把 100000 个人从上海运送到北京,用高铁循环运送 100000 次当然是不必要且低效的做法,在一瞬间读写控件 100000 次当然也是完全没有必要的。

类似的,在 aardio 调用 .NET 控件 DataGridView 的 示例 中也可以看到类似的技巧:

//一次读取所有数据到 aardio 数组
var data = dataTable.ExtractToArray();

//输出结果
for(i=1;#data;1){  
    winform.edit.dump(  data[i]  )  
}

//修改数据
data[1][2]= 999;

//替换并更新原来的数据
dataTable.FillFromArray(data,true) 

ReoGrid 为何如此高效

ReoGrid 将工作表从 100 行扩展到 100,000 行仅需 8 毫秒(0.008 秒)。

更新 100,000 个单元格数据仅需一秒,这意味着更新单个单元格只需 0.01 毫秒,速度非常快。
更新性能

以下技术被用于提升和优化性能:

说明

  1. 在 aardio 中通过 dotNet.ReoGrid 调用时,性能表现与原生 C# 版本完全一致
  2. 大规模数据操作建议使用数组作为参数批量读写 Excel,避免频繁跨语言调用
  3. 冻结窗格等高级功能通过优化算法保证流畅体验

Markdown 格式