From 1ca2e930ef4e9e50efd2680c229ef23c7f9c3658 Mon Sep 17 00:00:00 2001 From: Ben Gotow Date: Thu, 4 Feb 2016 20:13:37 -0800 Subject: [PATCH] perf(threads): Cache aliases to avoid GC thrashing in `isMeAccount` --- spec/models/contact-spec.coffee | 4 ++++ src/flux/models/contact.coffee | 7 +++---- src/flux/stores/account-store.coffee | 17 +++++++++-------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/spec/models/contact-spec.coffee b/spec/models/contact-spec.coffee index 6db1486a4..2bd705c0d 100644 --- a/spec/models/contact-spec.coffee +++ b/spec/models/contact-spec.coffee @@ -133,9 +133,13 @@ describe "Contact", -> expect(c1.isMe()).toBe(true) it "also matches any aliases you've created", -> + spyOn(AccountStore, 'aliases').andReturn [ + new Contact(name: 'Ben Other', email: 'ben22@nylas.com', accountId: TEST_ACCOUNT_ID) + ] spyOn(AccountStore, 'accounts').andReturn [ new Account provider: "gmail" + accountId: TEST_ACCOUNT_ID aliases: ["Ben Other "] emailAddress: 'ben@nylas.com' ] diff --git a/src/flux/models/contact.coffee b/src/flux/models/contact.coffee index 8082db919..cfa31e9a0 100644 --- a/src/flux/models/contact.coffee +++ b/src/flux/models/contact.coffee @@ -101,10 +101,9 @@ class Contact extends Model for account in AccountStore.accounts() if Utils.emailIsEquivalent(@email, account.emailAddress) return account - - for alias in account.aliases - if Utils.emailIsEquivalent(@email, Contact.fromString(alias).email) - return account + for alias in AccountStore.aliases() + if Utils.emailIsEquivalent(@email, alias.email) + return AccountStore.accountForId(alias.accountId) return null diff --git a/src/flux/stores/account-store.coffee b/src/flux/stores/account-store.coffee index 54d8dfa66..367aaa527 100644 --- a/src/flux/stores/account-store.coffee +++ b/src/flux/stores/account-store.coffee @@ -147,14 +147,15 @@ class AccountStore @_cachedGetter "accountForId:#{id}", => _.findWhere(@_accounts, {id}) aliases: => - aliases = [] - for acc in @_accounts - aliases.push(acc.me()) - for alias in acc.aliases - aliasContact = acc.meUsingAlias(alias) - aliasContact.isAlias = true - aliases.push(aliasContact) - return aliases + @_cachedGetter "aliases", => + aliases = [] + for acc in @_accounts + aliases.push(acc.me()) + for alias in acc.aliases + aliasContact = acc.meUsingAlias(alias) + aliasContact.isAlias = true + aliases.push(aliasContact) + return aliases aliasesFor: (accountsOrIds) => ids = accountsOrIds.map (accOrId) ->