2
0

JsValueArrayPool.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System.Runtime.CompilerServices;
  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. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  33. public JsValue[] RentArray(int size)
  34. {
  35. if (size == 0)
  36. {
  37. return System.Array.Empty<JsValue>();
  38. }
  39. if (size == 1)
  40. {
  41. return _poolArray1.Allocate();
  42. }
  43. if (size == 2)
  44. {
  45. return _poolArray2.Allocate();
  46. }
  47. if (size == 3)
  48. {
  49. return _poolArray3.Allocate();
  50. }
  51. return new JsValue[size];
  52. }
  53. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  54. public void ReturnArray(JsValue[] array)
  55. {
  56. if (array.Length == 1)
  57. {
  58. _poolArray1.Free(array);
  59. }
  60. else if (array.Length == 2)
  61. {
  62. _poolArray2.Free(array);
  63. }
  64. else if (array.Length == 3)
  65. {
  66. _poolArray3.Free(array);
  67. }
  68. }
  69. }
  70. }