Performance Improvements in Documents for Excel
GrapeCity Documents for Excel (GcExcel) is a fast, high-performance spreadsheet component. We've recently improved the performance time for many operations with this latest Service Pack 1.5.0.3.
Download the GcExcel Service Pack 1.5.0.3
Now faster than before! Check out some of our new enhancements:
- Getting/setting values for single cells
- Setting an array of double/int/float values to a range, for example, Range.Value = new double[,]{ {1d, 2d}, {3d, 4d}}
- Getting/setting styles for a single cell
We've conducted several tests with the new GcExcel version 1.5.0.3 and compared it with its previous version, as well as other competitors on three operating systems (Windows, MAC, and Linux).
Test machine configuration
Windows
- OS - Microsoft Windows 10 Enterprise
- Version - 10.0.16299 Build 16299
- System Type - x86_64
- Processor - Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz, 3601 Mhz, 4 Core(s), 8 Logical Processor(s)
- Installed Physical Memory (RAM) - 8.00 GB
MAC
- OS - macOS Sierra
- Version - 10.12.6
- Architecture - x86_64
- Processor - 2.7 GHz Intel Core i5
- Installed Physical Memory (RAM) - 16 GB 1867 MHz DDR3
Linux
- OS - Ubuntu
- Version - 16.04 LTS
- System Type - x86_64
- Processor - Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
- Installed Physical Memory (RAM) - 4.00 GB
Test application type
- .NET Core Console Application (.NET Core 2.1)
Test data
We populated 1,000,000 rows X 30 column cells with the random data:
- String values
- Date Time values
- Float values
- Double values
- Int values
Performance measurement
The performance time for following scenarios was measured at the point when values are set in a cell/range, and values are retrieved from a cell/range.
Set values for single cell
Random rand = new Random();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < rowCount; ++i)
{
worksheet.Range[i, 1].Value = string.Format("R{0}T{1}", i, i % 100);
worksheet.Range[i, 2].Value = string.Format("R{0}T{1}", i, i % 100);
worksheet.Range[i, 3].Value = string.Format("R{0}T{1}", i, i % 100);
worksheet.Range[i, 4].Value = string.Format("R{0}T{1}", i, i % 100);
worksheet.Range[i, 5].Value = string.Format("R{0}T{1}", i, i % 100);
worksheet.Range[i, 6].Value = DateTime.Now.AddDays(rand.NextDouble() * 10.0);
worksheet.Range[i, 7].Value = DateTime.Now.AddDays(rand.NextDouble() * 10.0);
worksheet.Range[i, 8].Value = DateTime.Now.AddDays(rand.NextDouble() * 10.0);
worksheet.Range[i, 9].Value = rand.Next(1000);
worksheet.Range[i, 10].Value = rand.Next(2000);
worksheet.Range[i, 11].Value = rand.Next(3000);
worksheet.Range[i, 12].Value = rand.Next(4000);
worksheet.Range[i, 13].Value = rand.Next(5000);
worksheet.Range[i, 14].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 15].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 16].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 17].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 18].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 19].Value = true;
worksheet.Range[i, 20].Value = false;
worksheet.Range[i, 31].Value = rand.Next(3000);
worksheet.Range[i, 32].Value = rand.Next(4000);
worksheet.Range[i, 33].Value = rand.Next(5000);
worksheet.Range[i, 34].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 35].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 36].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 37].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 38].Value = rand.NextDouble() * 10000.0;
worksheet.Range[i, 39].Value = true;
worksheet.Range[i, 30].Value = false;
}
stopwatch.Stop();
Get values for single cell
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
for (int i = 0; i < rowCount; ++i)
{
for (int j = 0; j < 30; j++)
{
values[i, j] = worksheet.Range[i, j].Value;
}
}
stopwatch.Stop();
Set values for range
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
worksheet.Range[0, 0, rowCount, columnCount].Value = values;
stopwatch.Stop();
Get values for range
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Restart();
var values = worksheet.Range[0, 0, rowCount, 30].Value;
stopwatch.Stop();
Performance results
Here are the performance results that compare GcExcel with its previous version and with other competitors.
Note: Note the considerable performance improvement of GcExcel version 1.5.0.3 in highlighted areas. This is a five times improvement over the previous version.
Performance sample
Download the sample and run the tests on your own!
We'll continue to monitor and improve the performance of GcExcel with every release.
Note: The results were taken on particular machine configurations. If you are running at a different configuration, the values may not exactly match with our collected results. In case you observe any discrepancies in the overall performance, please leave your comments below.