Title: Extremely low speed of ReadBufferDataHandle · Issue #467 · scijava/scijava-common · GitHub
Open Graph Title: Extremely low speed of ReadBufferDataHandle · Issue #467 · scijava/scijava-common
X Title: Extremely low speed of ReadBufferDataHandle · Issue #467 · scijava/scijava-common
Description: I tried to use ReadBufferDataHandle to speed up parsing TIFF, instead of simple FileHandle in my analog of TiffParser. And I was very surprised that the speed did not increase. Then I've created the following very simple test, which read...
Open Graph Description: I tried to use ReadBufferDataHandle to speed up parsing TIFF, instead of simple FileHandle in my analog of TiffParser. And I was very surprised that the speed did not increase. Then I've created th...
X Description: I tried to use ReadBufferDataHandle to speed up parsing TIFF, instead of simple FileHandle in my analog of TiffParser. And I was very surprised that the speed did not increase. Then I've create...
Opengraph URL: https://github.com/scijava/scijava-common/issues/467
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Extremely low speed of ReadBufferDataHandle","articleBody":"I tried to use ReadBufferDataHandle to speed up parsing TIFF, instead of simple FileHandle in my analog of TiffParser. And I was very surprised that the speed did not increase.\r\n\r\nThen I've created the following very simple test, which reads first 250000 of 4-byte integer values from some test file:\r\n\r\n```java\r\npublic class ReadArraySpeed {\r\n public static void main(String[] args) throws IOException, FormatException {\r\n if (args.length \u003c 1) {\r\n System.out.println(\"Usage:\");\r\n System.out.println(\" \" + ReadArraySpeed.class.getName() + \" any_file\");\r\n return;\r\n }\r\n\r\n final Location location = new FileLocation(new File(args[0]));\r\n for (int test = 1; test \u003c= 5; test++) { // - helps to warm JVM\r\n System.out.printf(\"Test #%d...%n\", test);\r\n try (Context context = new Context();\r\n DataHandle\u003cLocation\u003e in = context.getService(DataHandleService.class).create(location);\r\n DataHandle\u003cLocation\u003e inBuffer = context.getService(DataHandleService.class).readBuffer(location)) {\r\n final int elementSize = 4;\r\n final int size = (int) (Math.min(in.length(), 1_000_000) / elementSize);\r\n int[] a = new int[size];\r\n int[] b = new int[size];\r\n long t1 = System.nanoTime();\r\n in.seek(0);\r\n for (int k = 0; k \u003c a.length; k++) {\r\n a[k] = in.readInt();\r\n }\r\n long t2 = System.nanoTime();\r\n inBuffer.seek(0);\r\n for (int k = 0; k \u003c b.length; k++) {\r\n b[k] = inBuffer.readInt();\r\n }\r\n long t3 = System.nanoTime();\r\n System.out.printf(Locale.US, \"Reading %d 32-bit integers, %s: %.3f ms, %.3f MB/s%n\",\r\n size, in.getClass(),\r\n (t2 - t1) * 1e-6, (size * elementSize) / 1048576.0 / ((t2 - t1) * 1e-9));\r\n System.out.printf(Locale.US, \"Reading %d 32-bit integers, %s: %.3f ms, %.3f MB/s%n\",\r\n size, inBuffer.getClass(),\r\n (t3 - t2) * 1e-6, (size * elementSize) / 1048576.0 / ((t3 - t2) * 1e-9));\r\n }\r\n }\r\n }\r\n}\r\n```\r\nOn my computer, results are following:\r\nTest #1...\r\nReading 250000 32-bit integers, class org.scijava.io.handle.FileHandle: 317.620 ms, 3.003 MB/s\r\nReading 250000 32-bit integers, class org.scijava.io.handle.ReadBufferDataHandle: 2609.762 ms, 0.365 MB/s\r\nTest #2...\r\nReading 250000 32-bit integers, class org.scijava.io.handle.FileHandle: 336.619 ms, 2.833 MB/s\r\nReading 250000 32-bit integers, class org.scijava.io.handle.ReadBufferDataHandle: 2769.079 ms, 0.344 MB/s\r\nTest #3...\r\nReading 250000 32-bit integers, class org.scijava.io.handle.FileHandle: 302.576 ms, 3.152 MB/s\r\nReading 250000 32-bit integers, class org.scijava.io.handle.ReadBufferDataHandle: 2784.298 ms, 0.343 MB/s\r\nTest #4...\r\nReading 250000 32-bit integers, class org.scijava.io.handle.FileHandle: 307.343 ms, 3.103 MB/s\r\nReading 250000 32-bit integers, class org.scijava.io.handle.ReadBufferDataHandle: 2815.823 ms, 0.339 MB/s\r\nTest #5...\r\nReading 250000 32-bit integers, class org.scijava.io.handle.FileHandle: 317.017 ms, 3.008 MB/s\r\nReading 250000 32-bit integers, class org.scijava.io.handle.ReadBufferDataHandle: 3378.953 ms, 0.282 MB/s\r\n\r\nYou see that ReadBufferDataHandle works... not only not faster, but much slower than the simple DataHandle.\r\nDebugger shows that it performs a lot of calls of methods of low-level RandomAccessFile class, like exists(), length(). Maybe it is the reason.\r\n\r\nCould you cleanup ReadBufferDataHandle to make it really quick while the simple sequential reading?\r\n\r\nFor comparison, if you will replace \"readInt()\" call with \"readByte()\", you will see the expected result: ReadBufferDataHandle works much faster. This method is implemented in much more simple way and is really efficient. But reading single byte is a rare case, usually we need to read some other types or short buffers.\r\n\r\n\r\n","author":{"url":"https://github.com/Daniel-Alievsky","@type":"Person","name":"Daniel-Alievsky"},"datePublished":"2023-08-04T10:49:24.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":6},"url":"https://github.com/467/scijava-common/issues/467"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:d1703d59-74a6-7a0a-6cb0-ef6abebcc219 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | BD34:283961:3238598:41DEB0E:696D0538 |
| html-safe-nonce | 78171334257f12291fe66ffa74a23925d5289f7327363b61f0bbdc1eccf55ad2 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCRDM0OjI4Mzk2MTozMjM4NTk4OjQxREVCMEU6Njk2RDA1MzgiLCJ2aXNpdG9yX2lkIjoiMjQ3MTIwNTk5OTI3MjA2ODQwOCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | d4459740abe81d38ae8e10d868e1cf14f846182330e95322b6eb7ea2ab060387 |
| hovercard-subject-tag | issue:1836514118 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/scijava/scijava-common/467/issue_layout |
| twitter:image | https://opengraph.githubassets.com/747f698dd56956f286ceeeff7e68eef7cff5ed33c1810767523522a3f494baf9/scijava/scijava-common/issues/467 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/747f698dd56956f286ceeeff7e68eef7cff5ed33c1810767523522a3f494baf9/scijava/scijava-common/issues/467 |
| og:image:alt | I tried to use ReadBufferDataHandle to speed up parsing TIFF, instead of simple FileHandle in my analog of TiffParser. And I was very surprised that the speed did not increase. Then I've created th... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | Daniel-Alievsky |
| hostname | github.com |
| expected-hostname | github.com |
| None | 31994babd8463b50f2371f63aab0826561f4efe3981ac0ebc4c33e6c41032dbd |
| turbo-cache-control | no-preview |
| go-import | github.com/scijava/scijava-common git https://github.com/scijava/scijava-common.git |
| octolytics-dimension-user_id | 1262770 |
| octolytics-dimension-user_login | scijava |
| octolytics-dimension-repository_id | 3594497 |
| octolytics-dimension-repository_nwo | scijava/scijava-common |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 3594497 |
| octolytics-dimension-repository_network_root_nwo | scijava/scijava-common |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | f5a202c3c4aefc9cf00c8c78951a1e72eaebebeb |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width