Разница в производительности при чтении / записи многих файлов с помощью EPPlus и Spreadsheet Gear

Я сделал простой тест производительности между EPPlus и Spreadsheet Gear, чтобы узнать, есть ли существенная разница, которая оправдывала бы покупку Spreadsheet Gear.

Я не являюсь экспертом в любом приложении, поэтому, возможно, тесты не написаны наиболее эффективным способом.

Тест выполняет следующие действия: 1. Открывает существующий Excel-файл с 1000 строками и тремя столбцами. Сохраняет три значения в сущности, которая сохраняется в списке <>. 2. Откройте новый объект Excel 3. Создайте строку заголовка (полужирным) с заголовком каждого столбца. 4. Запишите 1000 объектов. 5. Сохраните новый файл Excel.

Если я проведу этот тест, как только EPPlus выйдет победителем (приблизительные времена – EPPlus = 280 мс, SG = 500 мс). Если вместо этого я запускаю тест 10 раз подряд (открытие цикла, копирование, сохранение 10 раз). Гибкая таблица быстрее (примерно раз в файл: EPPlus = 165 мс, SG = 95 мс). Для 20 тестов приблизительные времена: EPPlus = 160 мс / файл и SG = 60 мс / файл.

Похоже, что (по крайней мере, по крайней мере). Гибкие таблицы становятся все быстрее и быстрее, чем больше файлов я создаю. Может ли кто-нибудь объяснить, почему EPPlus является более медленным при выполнении последовательных тестов? Могу ли я внести изменения в код, чтобы изменить это?

Функция тестирования EPPlus:

var timer = new Stopwatch(); timer.Start(); var data = new List<Item>(); using (var excelIn = new ExcelPackage(new FileInfo(folder + fileIn))) { var sheet = excelIn.Workbook.Worksheets[1]; var row = 2; while (sheet.Cells[row, 1].Value != null) { data.Add(new Item() { Id = int.Parse(sheet.Cells[row, 1].Text), Title = sheet.Cells[row, 2].Text, Value = int.Parse(sheet.Cells[row, 3].Text) }); row++; } } using (var excelOut = new ExcelPackage()) { var sheet = excelOut.Workbook.Worksheets.Add("Out"); sheet.Cells.LoadFromCollection(data); sheet.InsertRow(1, 1); sheet.Cells[1, 1, 1, 3].Style.Font.Bold = true; sheet.Cells[1, 1].Value = "Id"; sheet.Cells[1, 2].Value = "Title"; sheet.Cells[1, 3].Value = "Value"; excelOut.SaveAs(new FileInfo(folder + "EPPlus_" + Guid.NewGuid() + ".xlsx")); } timer.Stop(); return timer.ElapsedMilliseconds; 

Гибкая таблица:

 var timer = new Stopwatch(); timer.Start(); var data = new List<Item>(); var excelIn = Factory.GetWorkbook(folder + fileIn); var sheetIn = excelIn.Worksheets[0]; var rowIn = 1; while (sheetIn.Cells[rowIn, 0].Value != null) { data.Add(new Item() { Id = int.Parse(sheetIn.Cells[rowIn, 0].Text), Title = sheetIn.Cells[rowIn, 1].Text, Value = int.Parse(sheetIn.Cells[rowIn, 2].Text) }); rowIn++; } excelIn.Close(); var excelOut = Factory.GetWorkbook(); var sheetOut = excelOut.Worksheets.Add(); sheetOut.Name = "Out"; var rowOut = 0; sheetOut.Cells[rowOut, 0, rowOut, 2].Font.Bold = true; sheetOut.Cells[rowOut, 0].Value = "Id"; sheetOut.Cells[rowOut, 1].Value = "Title"; sheetOut.Cells[rowOut++, 2].Value = "Value"; foreach (var item in data) { sheetOut.Cells[rowOut, 0].Value = item.Id; sheetOut.Cells[rowOut, 1].Value = item.Title; sheetOut.Cells[rowOut++, 2].Value = item.Value; } excelOut.SaveAs(folder + "SpreadsheetGear_" + Guid.NewGuid() + ".xlsx", FileFormat.OpenXMLWorkbook); excelOut.Close(); timer.Stop(); return timer.ElapsedMilliseconds; 

Основная функция

 var runs = 1; var testerG = new TestSpreadsheetGear(); var testerE = new TestEpPlus(); var msE = 0.0; var msG = 0.0; var i = 0; for (i = 0; i < runs; ++i) { msG += new TestSpreadsheetGear().Run(folder, originalFile); } for(i = 0; i < runs; ++i) { msE += new TestEpPlus().Run(folder, originalFile); } Console.WriteLine("Spreadsheet time: " + msG + ". Per file: " + msG / runs); Console.WriteLine("EP Plus time: " + msE + ". Per file: " + msE / runs); Console.ReadKey(); 

Я считаю, что причиной результатов, которые вы видите, является тот факт, что при первом запуске .NET CLR должен СОХРАНИТЬ код. Поскольку SpreadsheetGear – это полный движок электронной таблицы под капотом (в отличие от библиотеки чтения / записи), для JIT существует больше кода для JIT – таким образом, первый запуск занимает больше времени для SpreadsheetGear, чем EPPlus (я размышляю здесь, но имею большой опыт в тестировании кода .NET за последние 10 лет).

У меня нет EPPlus, но я написал тест, который пытается сделать то же самое, что вы делаете. с SpreadsheetGear 2012 Так как у меня нет вашей рабочей книги, я сначала создаю книгу. Затем я использовал более оптимальные API-интерфейсы SpreadsheetGear. При первом запуске я получаю 141 миллисекунду для SpreadsheetGear 2012. После первого запуска я получаю 9 или 10 миллисекунд за каждый прогон на разогнанном Core i7-980x под управлением Win7 x86 и запуск сборки без отладки.

Я вставил свой код ниже (просто вставьте его в консольное приложение .NET 4.0 C #).

Еще одна мысль о том, что это очень маленький тестовый пример. Чтобы действительно увидеть производительность SpreadsheetGear 2012, попробуйте сделать это со 100 000 строк или даже 1 миллион строк.

Отказ от ответственности: у меня есть ООО «SpreadsheetGear»

 using System; using System.Collections.Generic; using System.Diagnostics; using SpreadsheetGear; namespace SGvsEPPlus { class Program { internal struct Item { internal Item(int id, string title, int value) { Id = id; Title = title; Value = value; } internal int Id; internal string Title; internal int Value; } static void Test(int rows) { string filename = @"C:\tmp\MyWorkbook.xlsx"; Console.Write("Test({0})...", rows); var timer = new Stopwatch(); // Create workbook since we don't have poster's original workbook. timer.Restart(); var workbook = Factory.GetWorkbook(); var values = (SpreadsheetGear.Advanced.Cells.IValues)workbook.Worksheets[0]; for (int row = 1; row <= rows; row++) { values.SetNumber(row, 0, row); values.SetText(row, 1, "Title " + row); values.SetNumber(row, 2, row * 10); } Console.Write("Create workbook={0:0}...", timer.Elapsed.TotalMilliseconds); // Save workbook timer.Restart(); workbook.SaveAs(filename, FileFormat.OpenXMLWorkbook); Console.Write("Save workbook={0:0}...", timer.Elapsed.TotalMilliseconds); // Track total time of original test. var totalTimer = Stopwatch.StartNew(); // Open workbook timer.Restart(); var excelIn = Factory.GetWorkbook(filename); Console.Write("Open excelIn={0:0}...", timer.Elapsed.TotalMilliseconds); // Copy workbook to list timer.Restart(); var sheetIn = excelIn.Worksheets[0]; var valuesIn = (SpreadsheetGear.Advanced.Cells.IValues)sheetIn; var rowIn = 1; var data = new List<Item>(rows); while (valuesIn[rowIn, 0] != null) { data.Add(new Item( (int)valuesIn[rowIn, 0].Number, valuesIn[rowIn, 1].Text, (int)valuesIn[rowIn, 2].Number)); rowIn++; } excelIn.Close(); // Not necessary but left for consistency. Console.Write("excelIn->data={0:0}...", timer.Elapsed.TotalMilliseconds); timer.Restart(); var excelOut = Factory.GetWorkbook(); var sheetOut = excelOut.Worksheets[0]; var valuesOut = (SpreadsheetGear.Advanced.Cells.IValues)sheetOut; sheetOut.Name = "Out"; var rowOut = 0; sheetOut.Cells[rowOut, 0, rowOut, 2].Font.Bold = true; sheetOut.Cells[rowOut, 0].Value = "Id"; sheetOut.Cells[rowOut, 1].Value = "Title"; sheetOut.Cells[rowOut++, 2].Value = "Value"; foreach (var item in data) { valuesOut.SetNumber(rowOut, 0, item.Id); valuesOut.SetText(rowOut, 1, item.Title); valuesOut.SetNumber(rowOut, 2, item.Value); rowOut++; } Console.Write("data->excelOut={0:0}...", timer.Elapsed.TotalMilliseconds); timer.Restart(); excelOut.SaveAs(@"C:\tmp\SpreadsheetGear_" + Guid.NewGuid() + ".xlsx", FileFormat.OpenXMLWorkbook); excelOut.Close(); // Again - not necessary. Console.WriteLine("Save excelOut={0:0}...", timer.Elapsed.TotalMilliseconds); Console.WriteLine(" Total={0:0}", totalTimer.Elapsed.TotalMilliseconds); } static void Main(string[] args) { // Do it three times with 1000 rows. Note that the first // time takes longer because code must be JITted. Test(1000); Test(1000); Test(1000); } } } 
  • Как установить строгий формат даты «DD / MM / YYYY» с помощью SpreadSheetGear 2012
  • Есть ли способ узнать, защищен ли файл Excel 2007/2010 с помощью SpreadSheetGear 2012 для C # Asp.net MVC?
  • «Открыть существующий файл в Spreadsheetgear с помощью VB.Net
  • Как преобразовать все ячейки, форматированные в дате в IRange, в DateTime с помощью Spreadsheet Gear C #?
  • Диапазон копирования SpreadSheetGear 2012 с условным форматированием
  • Форматирование таблиц и форматирование даты
  • Set SpreadsheetGear workBookSet для уже открытого файла excel
  • UsedRange не возвращает строку - SpreadSheetGear
  • Руководство в Excel с использованием SpreadSheetGear
  • Печать excel (сгенерирована с использованием Spreadsheetgear) в C #
  • Извлечение деталей различного форматирования текста в пределах одной ячейки SpreadsheetGear
  • Interesting Posts

    Заполнение поля со списком пользовательской формы VBA со столбцом таблицы плюс дополнительная опция

    Как получить CodeName для рабочего листа в Excel с помощью VSTO

    Заполнение Combobox на второй пользовательской форме

    «Выбрать все фигуры» дает Excel VBA Error 438 – «Объект не поддерживает это свойство или метод»

    Workbook.Close () вызывает "Ошибка времени выполнения 9"

    Как я могу запретить Excel объединять данные строки в одну ячейку при вставке?

    Ссылка на плавающий столбец в формуле excel (VBA)

    Как читать содержимое вложений из рамки бота C #?

    недействительный выпуск / децимал

    Нужна формула для конкатенации 2 ячеек

    Как я могу выразить значения NaN в Excel?

    Выделить уникальные значения в итоговых группах

    Excel: выбор самого низкого статуса в списке

    Слияние двух таблиц в одну сводную таблицу – порядок столбцов разный

    Excel для Mac 2016 – Сохранить как CSV – Окончания неудачных строк

    Давайте будем гением компьютера.