本記事では、.NET Conf 2025でリリースのアナウンスがあった .NETの最新バージョン「.NET 10」において、「DioDocs for Excel(ディオドック)」とその他のExcel操作ライブラリ(ClosedXML、OpenXml、NPOI)を使用して、ワークシートにデータを追加する処理のベンチマークを測定した結果を紹介します。
はじめに
以前の記事(2024年11月15日)では .NET 9でベンチマークを測定していました。今回は改めて .NET 10で同じ処理を実行して測定しています。
実行環境
ベンチマークの測定には、.NET 10で動作するコンソールアプリケーションを作成して使用しています。測定に使用した実行環境は以下のとおりです。
- OS:Windows 11 Pro(10.0.22631.3085/23H2/2023Update/SunValley3)
- CPU:11th Gen Intel(R) Core(TM) i7-1195G7 @ 2.90GHz
- メモリ:32GB
- .NET 10.0.0 (10.0.25.52411)
- BenchmarkDotNet:0.15.6
- CloseXML:0.105.0
- DocumentFormat.OpenXml:3.3.0
- DioDocs.Excel.ja:8.2.2
- NPOI:2.7.5
測定に使用したコンソールアプリケーションのソースコードは以下に置いています。
実行する内容
このコンソールアプリケーションで実行する処理は、DioDocs for Excelをはじめとする各ライブラリを使用して「ワークシートで100 x 100の範囲のセルに文字を設定する」処理を記載しています。ベンチマークの測定にはBenchmarkDotNetを使用しています。
DioDocs for Excel
private const int ColumnNum = 100;
private const int RowNum = 100;
[Benchmark]
public void DioDocs()
{
var workbook = new GrapeCity.Documents.Excel.Workbook();
var worksheet = workbook.ActiveSheet;
for (var i = 1; i <= ColumnNum; i++)
{
for (var j = 1; j <= RowNum; j++)
{
worksheet.Range[i, j].Value = $"Hello World!{i}{j}";
}
}
workbook.Save(Stream.Null);
}ClosedXML
[Benchmark]
public void ClosedXML()
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Sheet1");
for (var i = 1; i <= ColumnNum; i++)
{
for (var j = 1; j <= RowNum; j++)
{
worksheet.Cell(i, j).Value = $"Hello World!{i}{j}";
}
}
workbook.SaveAs(Stream.Null);
}OpenXML
[Benchmark]
public void OpenXml()
{
using var spreadsheetDocument =
SpreadsheetDocument.Create(Stream.Null, SpreadsheetDocumentType.Workbook);
var workbookpart = spreadsheetDocument.AddWorkbookPart();
workbookpart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
var sheetData = new SheetData();
worksheetPart.Worksheet = new Worksheet(sheetData);
var sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets());
var sheet = new Sheet()
{
Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
SheetId = 1,
Name = "Sheet1"
};
sheets.Append(sheet);
for (var i = 1; i <= ColumnNum; i++)
{
for (var j = 1; j <= RowNum; j++)
{
var row = new Row();
var cell = new Cell
{
DataType = CellValues.String,
CellValue = new CellValue($"Hello World!{i}{j}")
};
row.Append(cell);
sheetData.Append(row);
}
}
workbookpart.Workbook.Save();
spreadsheetDocument.Dispose();
}NPOI
[Benchmark]
public void NPOI()
{
using var workbook = new XSSFWorkbook();
var worksheet = workbook.CreateSheet("Sheet1");
for (var i = 1; i <= ColumnNum; i++)
{
for (var j = 1; j <= RowNum; j++)
{
worksheet.CreateRow(i).CreateCell(j).SetCellValue($"Hello World!{i}{j}");
}
}
workbook.Write(Stream.Null);
}測定結果
上記のコンソールアプリケーションを .NET 10で実行した結果です。各ライブラリの「Mean(Arithmetic mean of all measurements)」の数値を比較してみると、他のライブラリよりもDioDocs for Excelが速いことが確認できます。

また、.NET 9で実行した結果と比較してみると、DioDocs for Excelや他のライブラリにおいても .NET 10で実行した結果の方が速いことが確認できます。

処理を増やして実行してみる
次は少し処理を増やして測定してみます。データを追加するセル範囲を以下のように更新します。以下はDioDocs for Excelを使用した場合のコードですが、他のライブラリでも同じように処理を実装しています。
private const int ColumnNum = 100;
private const int RowNum = 1000;
[Benchmark]
public void DioDocs()
{
var workbook = new GrapeCity.Documents.Excel.Workbook();
var worksheet = workbook.ActiveSheet;
for (var i = 1; i <= ColumnNum; i++)
{
for (var j = 1; j <= RowNum; j++)
{
worksheet.Range[i, j].Value = $"Hello World!{i}{j}";
}
}
workbook.Save(Stream.Null);
}測定結果
.NET 10で測定した結果です。各ライブラリの「Mean(Arithmetic mean of all measurements)」の数値を比較してみると、先ほどと同じように他のライブラリよりもDioDocsが速いことが確認できます。

また、.NET 9での測定結果と比較してみると、DioDocsに限らずその他のライブラリにおいても .NET 10で測定した結果の方が速いことも確認できます。

.NETでは .NET Coreの時代から長きにわたって継続的に処理パフォーマンスの向上に取り組んでいますが、今回の .NET 10でもその作業が行われておりしっかりと良い結果が得られることが確認できました。
今後もDioDocsの次期バージョン「V9J」や、.NETの次期LTSバージョン「.NET 12」などがリリースされたタイミングで、再度測定して結果をお届けしたいと思います。
さいごに
弊社Webサイトでは、製品の機能を気軽に試せるデモアプリケーションやトライアル版も公開していますので、こちらもご確認いただければと思います。
また、ご導入前の製品に関するご相談やご導入後の各種サービスに関するご質問など、お気軽にお問合せください。
