-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Abysmal performance for hash algorithms in dart:crypto #4611
Comments
As a starting point we should add a benchmark to trace performance of MD5: #import("dart:io"); main() { Set owner to @madsager. |
There is a lot that can be done to improve performance here. The data is being copied around way too much. Also, the code overflows smi range and (at least it used to be the case that) a lot of the medium-size integer operations ended up in runtime calls. cc @iposva-google. |
Added Triaged label. |
Mads, let's work together at creating a repeatable test case. I don't think file reading is really needed here. |
Removed Area-Library label. |
I wrote a little test just now and it looks like we can close this bug. Abysmal is certainly not what we see anymore: import "dart:io"; readFileFully(var path) { main() { // Now compute the MD5 hash on the read bytes. Gives this set of results on my MacBook: dalbe[runtime] ./xcodebuild/ReleaseX64/dart --package-root=./xcodebuild/ReleaseIA32/packages/ ~/dart/Bug4611.dart dalbe[runtime] time md5 ./xcodebuild/ReleaseX64/dart This means we calculate the MD5 hash for a 9.41MB file in 810ms, which is significantly better than the reported 6MB in 22 seconds. Added AssumedStale label. |
Removed Library-Crypto label. |
This issue has been moved to dart-lang/core#180. |
This issue was originally filed by [email protected]
Test code:
new File('recordroyale.ogg').readAsBytes().then((buf) {
var md5 = new MD5();
md5.update(buf);
print(md5.digest());
});
where 'recordroyale.ogg' is about six megabytes. This takes 22 seconds on my machine. Shelling out to md5sum(1) takes under 0.02 seconds. I understand that Dart won't ever be as fast as C, but with this disparity, the hash algorithms should be implemented in C[++] rather than Dart.
I had a vague suspicion that this was slow due to unnecessary allocations, but the allocations are mostly small and consumed quickly. Refactoring to eliminate unnecessary allocations resulted in no change.
My use case involved checksumming a byte array that existed only in memory at the relevant location; it is far less convenient to write data to a temporary file, shell out to md5sum(1), then delete that file.
The text was updated successfully, but these errors were encountered: