JsonBenchmark.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using BenchmarkDotNet.Attributes;
  2. using Jint.Native;
  3. using Jint.Native.Json;
  4. namespace Jint.Benchmark;
  5. [MemoryDiagnoser]
  6. public class JsonBenchmark
  7. {
  8. private Engine _engine;
  9. private readonly Dictionary<string, string> _sources = new()
  10. {
  11. { "twitter.json", "https://raw.githubusercontent.com/miloyip/nativejson-benchmark/master/data/twitter.json" },
  12. { "bestbuy_dataset.json", "https://github.com/algolia/examples/raw/master/instant-search/instantsearch.js/dataset_import/bestbuy_dataset.json" },
  13. };
  14. private readonly Dictionary<string, JsValue> _parsedInstance = new();
  15. private readonly Dictionary<string, string> _json = new();
  16. [GlobalSetup]
  17. public async Task GlobalSetup()
  18. {
  19. _engine = new Engine();
  20. foreach (var source in _sources)
  21. {
  22. var filePath = Path.Combine(Path.GetTempPath(), source.Key);
  23. if (!File.Exists(filePath))
  24. {
  25. using var client = new HttpClient();
  26. using var response = await client.GetAsync(source.Value);
  27. await using var streamToReadFrom = await response.Content.ReadAsStreamAsync();
  28. await using var streamToWriteTo = File.OpenWrite(filePath);
  29. await streamToReadFrom.CopyToAsync(streamToWriteTo);
  30. }
  31. var json = await File.ReadAllTextAsync(filePath);
  32. _json[source.Key] = json;
  33. var parser = new JsonParser(_engine);
  34. _parsedInstance[source.Key] = parser.Parse(json);
  35. }
  36. }
  37. public IEnumerable<string> FileNames()
  38. {
  39. foreach (var entry in _sources)
  40. {
  41. yield return entry.Key;
  42. }
  43. }
  44. [ParamsSource(nameof(FileNames))]
  45. public string FileName { get; set; }
  46. [Benchmark]
  47. public JsValue Parse()
  48. {
  49. var parser = new JsonParser(_engine);
  50. return parser.Parse(_json[FileName]);
  51. }
  52. [Benchmark]
  53. public JsValue Stringify()
  54. {
  55. var serializer = new JsonSerializer(_engine);
  56. return serializer.Serialize(_parsedInstance[FileName]);
  57. }
  58. }