Skip to content

Commit 23204df

Browse files
authored
Reduce memory allocations (#144)
1 parent 057ad24 commit 23204df

File tree

6 files changed

+33
-18
lines changed

6 files changed

+33
-18
lines changed

Assets/Plugins/StreamChat/Core/Helpers/ICollectionExt.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,24 @@ namespace StreamChat.Core.Helpers
1010
/// </summary>
1111
internal static class ICollectionExt
1212
{
13+
14+
/// <summary>
15+
/// In Unity 2019.4.40f1 List.Contains allocates memory. Use this allocation free alternative
16+
/// </summary>
17+
[Pure]
18+
public static bool ContainsNoAlloc<TItem>(this List<TItem> source, TItem item)
19+
{
20+
for (var i = 0; i < source.Count; i++)
21+
{
22+
if (EqualityComparer<TItem>.Default.Equals(source[i], item))
23+
{
24+
return true;
25+
}
26+
}
27+
28+
return false;
29+
}
30+
1331
[Pure]
1432
public static List<TDto> TrySaveToDtoCollection<TSource, TDto>(this List<TSource> source)
1533
where TSource : ISavableTo<TDto>

Assets/Plugins/StreamChat/Core/InternalDTO/Models/APIErrorInternalDTO.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,6 @@ internal partial class APIErrorInternalDTO
5858
[Newtonsoft.Json.JsonProperty("more_info", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
5959
public string MoreInfo { get; set; }
6060

61-
private System.Collections.Generic.Dictionary<string, object> _additionalProperties = new System.Collections.Generic.Dictionary<string, object>();
62-
63-
[Newtonsoft.Json.JsonExtensionData]
64-
public System.Collections.Generic.Dictionary<string, object> AdditionalProperties
65-
{
66-
get { return _additionalProperties; }
67-
set { _additionalProperties = value; }
68-
}
69-
7061
}
7162

7263
}

Assets/Plugins/StreamChat/Core/LowLevelClient/Models/APIError.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ APIError ILoadableFrom<APIErrorInternalDTO, APIError>.LoadFromDto(APIErrorIntern
8686
ExceptionFields = dto.ExceptionFields;
8787
Message = dto.Message;
8888
MoreInfo = dto.MoreInfo;
89-
AdditionalProperties = dto.AdditionalProperties;
9089

9190
return this;
9291
}

Assets/Plugins/StreamChat/Core/LowLevelClient/StreamChatLowLevelClient.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -790,8 +790,11 @@ private void HandleNewWebsocketMessage(string msg)
790790
return;
791791
}
792792

793-
var time = DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss");
794-
EventReceived?.Invoke($"{time} - Event received: <b>{type}</b>");
793+
if (EventReceived != null)
794+
{
795+
var time = DateTime.Now.TimeOfDay.ToString(@"hh\:mm\:ss");
796+
EventReceived.Invoke($"{time} - Event received: <b>{type}</b>");
797+
}
795798

796799
if (!_eventKeyToHandler.TryGetValue(type, out var handler))
797800
{

Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,9 @@ public async Task<IStreamMessage> SendNewMessageAsync(StreamSendMessageRequest s
193193

194194
var response = await LowLevelClient.InternalMessageApi.SendNewMessageAsync(Type, Id,
195195
sendMessageRequest.TrySaveToDto());
196+
197+
//StreamTodo: we update internal cache message without server confirmation that message got accepted. e.g. message could be rejected
198+
//It's ok to update the cache "in good faith" to not introduce update delay but we should handle if message got rejected
196199
var streamMessage = InternalAppendOrUpdateMessage(response.Message);
197200
return streamMessage;
198201
}
@@ -757,7 +760,7 @@ internal void HandleChannelTruncatedEvent(NotificationChannelTruncatedEventInter
757760

758761
internal void InternalAddMember(StreamChannelMember member)
759762
{
760-
if (_members.Contains(member))
763+
if (_members.ContainsNoAlloc(member))
761764
{
762765
return;
763766
}
@@ -769,7 +772,7 @@ internal void InternalAddMember(StreamChannelMember member)
769772

770773
internal void InternalRemoveMember(StreamChannelMember member)
771774
{
772-
if (!_members.Contains(member))
775+
if (!_members.ContainsNoAlloc(member))
773776
{
774777
return;
775778
}
@@ -781,7 +784,7 @@ internal void InternalRemoveMember(StreamChannelMember member)
781784

782785
internal void InternalUpdateMember(StreamChannelMember member)
783786
{
784-
if (!_members.Contains(member))
787+
if (!_members.ContainsNoAlloc(member))
785788
{
786789
_members.Add(member);
787790
}
@@ -822,7 +825,7 @@ private StreamMessage InternalAppendOrUpdateMessage(MessageInternalDTO dto)
822825
var streamMessage = Cache.TryCreateOrUpdate(dto, out var wasCreated);
823826
if (wasCreated)
824827
{
825-
if (!_messages.Contains(streamMessage))
828+
if (!_messages.ContainsNoAlloc(streamMessage))
826829
{
827830
_messages.Add(streamMessage);
828831
MessageReceived?.Invoke(this, streamMessage);
@@ -959,7 +962,7 @@ internal void InternalHandleUserWatchingStartEvent(UserWatchingStartEventInterna
959962
AssertCid(eventDto.Cid);
960963

961964
var user = Cache.TryCreateOrUpdate(eventDto.User, out var wasCreated);
962-
if (wasCreated || !_watchers.Contains(user))
965+
if (wasCreated || !_watchers.ContainsNoAlloc(user))
963966
{
964967
WatcherCount += 1;
965968
_watchers.Add(user);
@@ -1010,7 +1013,7 @@ internal void InternalHandleTypingStarted(TypingStartEventInternalDTO eventDto)
10101013
var user = Cache.TryCreateOrUpdate(eventDto.User);
10111014
StreamAsserts.AssertNotNull(user, nameof(user));
10121015

1013-
if (!_typingUsers.Contains(user))
1016+
if (!_typingUsers.ContainsNoAlloc(user))
10141017
{
10151018
_typingUsers.Add(user);
10161019
UserStartedTyping?.Invoke(this, user);

Assets/Plugins/StreamChat/Core/WSEventType.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ internal static class WSEventType
4141
public const string NotificationRemovedFromChannel = "notification.removed_from_channel";
4242
public const string NotificationMutesUpdated = "notification.mutes_updated";
4343
public const string NotificationChannelMutesUpdated = "notification.channel_mutes_updated";
44+
//StreamTodo: implement NOTIFICATION.MARK_UNREAD
4445
}
4546
}

0 commit comments

Comments
 (0)