JsValueArrayPool.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using Jint.Native;
  3. namespace Jint.Pooling
  4. {
  5. /// <summary>
  6. /// Cache reusable <see cref="JsValue" /> array instances as we allocate them a lot.
  7. /// </summary>
  8. internal sealed class JsValueArrayPool
  9. {
  10. private const int PoolSize = 15;
  11. private readonly ObjectPool<JsValue[]> _poolArray1;
  12. private readonly ObjectPool<JsValue[]> _poolArray2;
  13. private readonly ObjectPool<JsValue[]> _poolArray3;
  14. public JsValueArrayPool()
  15. {
  16. _poolArray1 = new ObjectPool<JsValue[]>(Factory1, PoolSize);
  17. _poolArray2 = new ObjectPool<JsValue[]>(Factory2, PoolSize);
  18. _poolArray3 = new ObjectPool<JsValue[]>(Factory3, PoolSize);
  19. }
  20. private static JsValue[] Factory1()
  21. {
  22. return new JsValue[1];
  23. }
  24. private static JsValue[] Factory2()
  25. {
  26. return new JsValue[2];
  27. }
  28. private static JsValue[] Factory3()
  29. {
  30. return new JsValue[3];
  31. }
  32. public JsValue[] RentArray(int size)
  33. {
  34. switch (size)
  35. {
  36. case 0:
  37. return Array.Empty<JsValue>();
  38. case 1:
  39. return _poolArray1.Allocate();
  40. case 2:
  41. return _poolArray2.Allocate();
  42. case 3:
  43. return _poolArray3.Allocate();
  44. }
  45. return new JsValue[size];
  46. }
  47. public void ReturnArray(JsValue[] array)
  48. {
  49. switch (array.Length)
  50. {
  51. case 1:
  52. _poolArray1.Free(array);
  53. break;
  54. case 2:
  55. _poolArray2.Free(array);
  56. break;
  57. case 3:
  58. _poolArray3.Free(array);
  59. break;
  60. }
  61. }
  62. }
  63. }