fix(differenceBy): Make differenceBy fast #28
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The es-toolkit's
differenceBy
function becomes slower compared to lodash'sdifferenceBy
as the array size increases.Therefore, I have modified the
differenceBy
function in es-toolkit so that it performs faster even as the array size increases.I have reduced the time complexity from O(n*m) to O(n+m).
AS-IS benchmark(es-toolkit vs lodash)
firstArr's size : 3
![image](https://private-user-images.githubusercontent.com/55759551/337713327-9b1d1c9f-7469-4334-a8a3-592fefa81fa8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1ODk3NTIsIm5iZiI6MTczOTU4OTQ1MiwicGF0aCI6Ii81NTc1OTU1MS8zMzc3MTMzMjctOWIxZDFjOWYtNzQ2OS00MzM0LWE4YTMtNTkyZmVmYTgxZmE4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDAzMTczMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ4ZGQ0YWM3YzMyN2U1ZTgxNzc4NDFmZTgyZjNkYjlmMjEzZmMyM2E5ZjNlYmZjMjIzZWM4OGFmYzRlMzM5MjUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.KJOrFD-ISdxe6KeIKFZCZviPLyHLk3uvhzArGHRUdhA)
secondArr's size : 1
mapper: Math.floor
firstArr's size : 500
![image](https://private-user-images.githubusercontent.com/55759551/337710372-d5264bf7-d024-4c47-b550-9cc8f3e632f8.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1ODk3NTIsIm5iZiI6MTczOTU4OTQ1MiwicGF0aCI6Ii81NTc1OTU1MS8zMzc3MTAzNzItZDUyNjRiZjctZDAyNC00YzQ3LWI1NTAtOWNjOGYzZTYzMmY4LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDAzMTczMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTczMTdmZTRiMTllNDIxMGE0MzIzZDNkNjgzYjUwNWYzMmEzNTUyN2NmOGYyMDdjYTQ5OTM0ZTAwNTUxNjQ4NTEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.lJsrMWevtRqYcMC_EGjQz3wgoAElNNqKLjjb4P9G7Uk)
secondArr's size : 250
mapper: Math.floor
TO-BE benchmark(es-toolkit vs lodash)
firstArr's size : 3
![image](https://private-user-images.githubusercontent.com/55759551/337713451-977be89e-4b12-4bc5-88e2-9a64cdde887e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1ODk3NTIsIm5iZiI6MTczOTU4OTQ1MiwicGF0aCI6Ii81NTc1OTU1MS8zMzc3MTM0NTEtOTc3YmU4OWUtNGIxMi00YmM1LTg4ZTItOWE2NGNkZGU4ODdlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDAzMTczMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg0OGIzN2RmYmY1ZjJlYWFmNzFhMzQ4ZDdmOWEwMDIwNmQ0OWNmOTBmZWU0OTM5ZWIxZDE2Yzc4Zjg5OWMzZWYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.XD7eeZ8B6eyFHx_yIQRAWzyZsCzu0AQAL-Zd7LGmEmU)
secondArr's size : 1
mapper: Math.floor
firstArr's size : 500
![image](https://private-user-images.githubusercontent.com/55759551/337710660-2805f3f5-e62e-4318-a135-14a969f6e874.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1ODk3NTIsIm5iZiI6MTczOTU4OTQ1MiwicGF0aCI6Ii81NTc1OTU1MS8zMzc3MTA2NjAtMjgwNWYzZjUtZTYyZS00MzE4LWExMzUtMTRhOTY5ZjZlODc0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDAzMTczMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWMwZmE2NmJhMjUwNTA3MDMwY2EzODhjNjRhY2YzOTc1MWVjOTU1OWVmZmIyOTExY2EyMzRmNzRlNzU0ZDJkNzImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.Lh5sP6HzBIpBH7kDbi0-M_8_cwOdmKdl6IXT-L6A5Zg)
secondArr's size : 250
mapper: Math.floor
Benchmark(old differenceBy vs new differenceBy)
firstArr's size : 3
![image](https://private-user-images.githubusercontent.com/55759551/337713064-f4ff0f41-ad11-484b-aa15-d2c46ef59954.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1ODk3NTIsIm5iZiI6MTczOTU4OTQ1MiwicGF0aCI6Ii81NTc1OTU1MS8zMzc3MTMwNjQtZjRmZjBmNDEtYWQxMS00ODRiLWFhMTUtZDJjNDZlZjU5OTU0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDAzMTczMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM4ZDdmNDg4MmQ3YWYwZGQyNDMwMzMwOGUyNjUzY2U2NWUwMWNkYTBhOGRkOTVjYmMyMTQyMDYzZmE5ZDMxMWQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hnvZqBjSGN9IZaO5s2SaVh2F_s4ULkgz1Hp3L3GsGb0)
secondArr's size : 1
mapper: Math.floor
firstArr's size : 500
![image](https://private-user-images.githubusercontent.com/55759551/337712687-994a9a59-6cd3-40d6-b2a8-64e2afcb5a3d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1ODk3NTIsIm5iZiI6MTczOTU4OTQ1MiwicGF0aCI6Ii81NTc1OTU1MS8zMzc3MTI2ODctOTk0YTlhNTktNmNkMy00MGQ2LWIyYTgtNjRlMmFmY2I1YTNkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDAzMTczMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWMyYzQxMTA0NzhkNTMzYmU2Y2FiZjYwYTE4MjVlOWYyMjQyNjQzOGFhNDI5ZmVjZDNlYjA1ZjE0MWM5ZjE1NDYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.UFHqy02BwoxEN7Uqnn6v_FgA8AAS2ZOgffAcw2EEeuc)
secondArr's size : 250
mapper: Math.floor
firstArr's size : 10,000
![image](https://private-user-images.githubusercontent.com/55759551/337712850-5ee5f8da-cf20-4db4-9664-dc2dd856ff0b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk1ODk3NTIsIm5iZiI6MTczOTU4OTQ1MiwicGF0aCI6Ii81NTc1OTU1MS8zMzc3MTI4NTAtNWVlNWY4ZGEtY2YyMC00ZGI0LTk2NjQtZGMyZGQ4NTZmZjBiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDAzMTczMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMyYjliM2NiZjk0OTBmMzE2ZWU4MTBkOTEwZmE5Mjc0ZjgxOGI4MTQzYzMzMjQ2NzY5MjA3NzM2ODE0YmEzZTgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.MpyYnKeHPWQeNjz2oIoeMdFV5hcuwpNh8z4C7jXhT6Q)
secondArr's size : 5,000
mapper: Math.floor