# dotNet.ReoGrid 扩展库 - 性能优化

快速和轻量级一直是 ReoGrid 的开发目标。即使现在已经支持许多功能，ReoGrid 仍然采用多种技术来优化性能并提升用户体验。

## aardio 调用 ReoGrid 性能优化

ReoGrid 是一个 .NET 组件。
在 aardio 中调用 .NET 很方便，ReoGrid 官方文档中的 C# 示例我们几乎不需要太多修改就可以直接将其用于 aardio 。

但是我们需要了解 aardio 调用 .NET 这中间要经过跨语言的接口交互，当然这过程依然很快，但如何在循环中大量、快速、密集调用，积少成多可能就会影响到程序性能。

例如下面这样循环写入大量数据将会非常慢：

```aardio
//快速扩展行数
var sheet1 = grid.CurrentWorksheet; 
sheet1.Rows = 100000; // 扩展到10万行
 
//循环写数据
for(i=1;100000;1){
    sheet1.SetCellData(i-1, 0, "数据"+i);
}

```

优化的方法其实非常简单，我们应当在 aardio 中处理数据，再用数组一次性传给表格，那么即使写入上万行，速度也会快如闪电。

优化后的 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 数组](../../../../std/dotNet/type-conversion.html#object)。 


所以这个的关键不是优化 ReoGrid 控件本身的速度，其实它已经很快了，而是要调整写程序的思路。

这就好比要把 100000 个人从上海运送到北京，用高铁循环运送 100000 次当然是不必要且低效的做法，在一瞬间读写控件 100000 次当然也是完全没有必要的。

类似的，在 aardio 调用 .NET 控件 DataGridView 的 [示例](../../../../../examples/Languages/dotNet/Control/Forms.CreateEmbed.html) 中也可以看到类似的技巧：

```aardio
//一次读取所有数据到 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 毫秒，速度非常快。  
![更新性能](../images/update_performance.png)

以下技术被用于提升和优化性能：

- 优化的内存管理

    ReoGrid 采用优化的内存管理技术来提高单元格内存使用效率。该技术将大型电子表格在内存中分割为多个小型工作表，形成树状结构。内存分配和释放操作在这些分页的小型工作表上进行，从而在内存使用时间和大小之间取得良好平衡。  
    ![内存管理](../images/47.png)

- 优化的边框算法

    通常电子表格包含大量需要管理和显示的单元格边框。为了最大化渲染性能，ReoGrid 仅绘制可视区域内的边框。通过特殊算法可以快速建立可视区域与边框之间的映射关系，从而极速定位绘制起点。  
    ![边框算法](../images/39-2.png)

- 优化的视口算法

    ReoGrid 采用独特算法管理和渲染可视区域，实现冻结窗口、大纲和打印功能。每个视口独立工作，可单独缩放或滚动。该算法能最大化计算渲染区域的性能，优化文本渲染和图形绘制效率。  
    ![视口算法](../images/54.png)

> **说明**：  
> 1. 在 aardio 中通过 dotNet.ReoGrid 调用时，性能表现与原生 C# 版本完全一致  
> 2. 大规模数据操作建议使用数组作为参数批量读写 Excel，避免频繁跨语言调用  
> 3. 冻结窗格等高级功能通过优化算法保证流畅体验