From b84ae7290b4b8913120e2437591df5ec81e601e2 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 25 Feb 2020 17:02:15 +0100 Subject: [PATCH] More minor performance improvements. --- .../Contents/Text/Extensions.cs | 42 +++++++++++-------- .../EventSourcing/StreamPosition.cs | 31 ++++++++++---- .../EventSourcing/StreamPosition.cs | 30 ++++++++----- .../Email/SmtpEmailSender.cs | 8 ++-- .../Log/JsonLogWriterFactory.cs | 8 ++-- .../TestSuite.ApiTests/GraphQLTests.cs | 2 +- 6 files changed, 76 insertions(+), 45 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs index a97e78b87..4adc35151 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs @@ -15,7 +15,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { public static class Extensions { - private static readonly ObjectPool Pool = new DefaultObjectPool(new StringBuilderPooledObjectPolicy()); + private static readonly ObjectPool StringBuilderPool = + new DefaultObjectPool(new StringBuilderPooledObjectPolicy()); public static Dictionary ToTexts(this NamedContentData data) { @@ -24,23 +25,30 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text if (data != null) { var languages = new Dictionary(); - - foreach (var value in data.Values) + try { - if (value != null) + foreach (var value in data.Values) { - foreach (var (key, jsonValue) in value) + if (value != null) { - AppendJsonText(languages, key, jsonValue); + foreach (var (key, jsonValue) in value) + { + AppendJsonText(languages, key, jsonValue); + } } } - } - foreach (var (key, stringBuilder) in languages) + foreach (var (key, sb) in languages) + { + result[key] = sb.ToString(); + } + } + finally { - result[key] = stringBuilder.ToString(); - - Pool.Return(stringBuilder); + foreach (var (_, sb) in languages) + { + StringBuilderPool.Return(sb); + } } } @@ -73,19 +81,19 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { if (!string.IsNullOrWhiteSpace(text)) { - if (!languages.TryGetValue(language, out var stringBuilder)) + if (!languages.TryGetValue(language, out var sb)) { - stringBuilder = Pool.Get(); + sb = StringBuilderPool.Get(); - languages[language] = stringBuilder; + languages[language] = sb; } - if (stringBuilder.Length > 0) + if (sb.Length > 0) { - stringBuilder.Append(" "); + sb.Append(" "); } - stringBuilder.Append(text); + sb.Append(text); } } } diff --git a/backend/src/Squidex.Infrastructure.Azure/EventSourcing/StreamPosition.cs b/backend/src/Squidex.Infrastructure.Azure/EventSourcing/StreamPosition.cs index b3b7ae9ac..b35ffdf0d 100644 --- a/backend/src/Squidex.Infrastructure.Azure/EventSourcing/StreamPosition.cs +++ b/backend/src/Squidex.Infrastructure.Azure/EventSourcing/StreamPosition.cs @@ -6,11 +6,15 @@ // ========================================================================== using System.Text; +using Microsoft.Extensions.ObjectPool; namespace Squidex.Infrastructure.EventSourcing { internal sealed class StreamPosition { + private static readonly ObjectPool StringBuilderPool = + new DefaultObjectPool(new StringBuilderPooledObjectPolicy()); + public long Timestamp { get; } public long CommitOffset { get; } @@ -32,15 +36,21 @@ namespace Squidex.Infrastructure.EventSourcing public static implicit operator string(StreamPosition position) { - var sb = new StringBuilder(20); - - sb.Append(position.Timestamp); - sb.Append("-"); - sb.Append(position.CommitOffset); - sb.Append("-"); - sb.Append(position.CommitSize); + var sb = StringBuilderPool.Get(); + try + { + sb.Append(position.Timestamp); + sb.Append("-"); + sb.Append(position.CommitOffset); + sb.Append("-"); + sb.Append(position.CommitSize); - return sb.ToString(); + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); + } } public static implicit operator StreamPosition(string? position) @@ -49,7 +59,10 @@ namespace Squidex.Infrastructure.EventSourcing { var parts = position.Split('-'); - return new StreamPosition(long.Parse(parts[0]), long.Parse(parts[1]), long.Parse(parts[2])); + return new StreamPosition( + long.Parse(parts[0]), + long.Parse(parts[1]), + long.Parse(parts[2])); } return new StreamPosition(0, -1, -1); diff --git a/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs b/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs index b5fb946d4..3c251a0ab 100644 --- a/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs +++ b/backend/src/Squidex.Infrastructure.MongoDb/EventSourcing/StreamPosition.cs @@ -6,12 +6,16 @@ // ========================================================================== using System.Text; +using Microsoft.Extensions.ObjectPool; using MongoDB.Bson; namespace Squidex.Infrastructure.EventSourcing { internal sealed class StreamPosition { + private static readonly ObjectPool StringBuilderPool = + new DefaultObjectPool(new StringBuilderPooledObjectPolicy()); + private static readonly BsonTimestamp EmptyTimestamp = new BsonTimestamp(946681200, 0); public BsonTimestamp Timestamp { get; } @@ -35,17 +39,23 @@ namespace Squidex.Infrastructure.EventSourcing public static implicit operator string(StreamPosition position) { - var sb = new StringBuilder(20); - - sb.Append(position.Timestamp.Timestamp); - sb.Append("-"); - sb.Append(position.Timestamp.Increment); - sb.Append("-"); - sb.Append(position.CommitOffset); - sb.Append("-"); - sb.Append(position.CommitSize); + var sb = StringBuilderPool.Get(); + try + { + sb.Append(position.Timestamp.Timestamp); + sb.Append("-"); + sb.Append(position.Timestamp.Increment); + sb.Append("-"); + sb.Append(position.CommitOffset); + sb.Append("-"); + sb.Append(position.CommitSize); - return sb.ToString(); + return sb.ToString(); + } + finally + { + StringBuilderPool.Return(sb); + } } public static implicit operator StreamPosition(string? position) diff --git a/backend/src/Squidex.Infrastructure/Email/SmtpEmailSender.cs b/backend/src/Squidex.Infrastructure/Email/SmtpEmailSender.cs index d7b13b81d..60c441701 100644 --- a/backend/src/Squidex.Infrastructure/Email/SmtpEmailSender.cs +++ b/backend/src/Squidex.Infrastructure/Email/SmtpEmailSender.cs @@ -18,7 +18,7 @@ namespace Squidex.Infrastructure.Email public sealed class SmtpEmailSender : IEmailSender { private readonly SmptOptions options; - private readonly ObjectPool pool; + private readonly ObjectPool clientPool; internal sealed class SmtpClientPolicy : PooledObjectPolicy { @@ -53,19 +53,19 @@ namespace Squidex.Infrastructure.Email this.options = options.Value; - pool = new DefaultObjectPoolProvider().Create(new SmtpClientPolicy(options.Value)); + clientPool = new DefaultObjectPoolProvider().Create(new SmtpClientPolicy(options.Value)); } public async Task SendAsync(string recipient, string subject, string body) { - var smtpClient = pool.Get(); + var smtpClient = clientPool.Get(); try { await smtpClient.SendMailAsync(options.Sender, recipient, subject, body); } finally { - pool.Return(smtpClient); + clientPool.Return(smtpClient); } } } diff --git a/backend/src/Squidex.Infrastructure/Log/JsonLogWriterFactory.cs b/backend/src/Squidex.Infrastructure/Log/JsonLogWriterFactory.cs index 4ee0bdc6f..1968b214a 100644 --- a/backend/src/Squidex.Infrastructure/Log/JsonLogWriterFactory.cs +++ b/backend/src/Squidex.Infrastructure/Log/JsonLogWriterFactory.cs @@ -12,7 +12,7 @@ namespace Squidex.Infrastructure.Log { public sealed class JsonLogWriterFactory : IObjectWriterFactory { - private readonly ObjectPool pool; + private readonly ObjectPool writerPool; internal sealed class JsonLogWriterPolicy : PooledObjectPolicy { @@ -47,7 +47,7 @@ namespace Squidex.Infrastructure.Log public JsonLogWriterFactory(bool indended = false, bool formatLine = false) { - pool = new DefaultObjectPoolProvider().Create(new JsonLogWriterPolicy(indended, formatLine)); + writerPool = new DefaultObjectPoolProvider().Create(new JsonLogWriterPolicy(indended, formatLine)); } public static JsonLogWriterFactory Default() @@ -62,12 +62,12 @@ namespace Squidex.Infrastructure.Log public IObjectWriter Create() { - return pool.Get(); + return writerPool.Get(); } public void Release(IObjectWriter writer) { - pool.Return((JsonLogWriter)writer); + writerPool.Return((JsonLogWriter)writer); } } } diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs index d7973331b..a23c86ee3 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/GraphQLTests.cs @@ -93,7 +93,7 @@ namespace TestSuite.ApiTests data: flatData { name cities { - data:flatData { + data: flatData { name } }