Skip to main content Skip to footer

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.

Windows performance results Windows performance results

Mac performance results Mac performance results

Linux performance results Linux performance results

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.

Download the new GcExcel package 1.5.0.3.

Shilpa Sharma - Product Manager

Shilpa Sharma

Product Manager
comments powered by Disqus