TablePerformanceTest.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.Diagnostics;
  3. using System.Linq;
  4. using BenchmarkDotNet.Attributes;
  5. using BenchmarkDotNet.Configs;
  6. using BenchmarkDotNet.Engines;
  7. using BenchmarkDotNet.Running;
  8. using NUnit.Framework;
  9. using QuestPDF.Drawing;
  10. using QuestPDF.Drawing.Proxy;
  11. using QuestPDF.Elements;
  12. using QuestPDF.Fluent;
  13. using QuestPDF.Helpers;
  14. using QuestPDF.Infrastructure;
  15. namespace QuestPDF.Examples
  16. {
  17. [SimpleJob(RunStrategy.Monitoring, launchCount: 0, warmupCount: 1, targetCount: 16)]
  18. [MinColumn, MaxColumn, MeanColumn, MedianColumn]
  19. public class TablePerformanceTest
  20. {
  21. private static Random Random { get; } = new Random();
  22. private PageContext PageContext { get; set; }
  23. private DocumentMetadata Metadata { get; set; }
  24. private Container Content { get; set; }
  25. [Test]
  26. public void Run()
  27. {
  28. var configuration = ManualConfig
  29. .Create(DefaultConfig.Instance)
  30. .WithOptions(ConfigOptions.DisableOptimizationsValidator);
  31. BenchmarkRunner.Run<TablePerformanceTest>(configuration);
  32. }
  33. [IterationSetup]
  34. [SetUp]
  35. public void GenerateReportData()
  36. {
  37. Metadata = new DocumentMetadata()
  38. {
  39. DocumentLayoutExceptionThreshold = 1000
  40. };
  41. var documentContainer = new DocumentContainer();
  42. documentContainer.Page(page =>
  43. {
  44. page.Size(PageSizes.A3);
  45. GeneratePerformanceStructure(page.Content(), 10_000);
  46. });
  47. Content = documentContainer.Compose();
  48. PageContext = new PageContext();
  49. DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
  50. Content.HandleVisitor(x =>
  51. {
  52. if (x is ICacheable)
  53. x.CreateProxy(y => new CacheProxy(y));
  54. });
  55. }
  56. [Benchmark]
  57. [Test]
  58. public void GenerationTest()
  59. {
  60. DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
  61. }
  62. void GeneratePerformanceStructure(IContainer container, int itemsCount)
  63. {
  64. container
  65. .Padding(25)
  66. .Table(table =>
  67. {
  68. table.ColumnsDefinition(columns =>
  69. {
  70. foreach (var size in Enumerable.Range(0, 10))
  71. columns.ConstantColumn(100);
  72. });
  73. foreach (var i in Enumerable.Range(1, itemsCount))
  74. {
  75. table
  76. .Cell()
  77. .RowSpan((uint)Random.Next(1, 5))
  78. .ColumnSpan((uint)Random.Next(1, 5))
  79. .Element(CreateBox(i.ToString()));
  80. }
  81. });
  82. }
  83. private Action<IContainer> CreateBox(string label)
  84. {
  85. return container =>
  86. {
  87. var height = Random.Next(2, 6) * 20;
  88. container
  89. .Border(2)
  90. .Background(Placeholders.BackgroundColor())
  91. .AlignCenter()
  92. .AlignMiddle()
  93. .Height(height)
  94. .Text($"{label}: {height}px");
  95. };
  96. }
  97. }
  98. }