On Wed, 17 Jul 2024 15:35:26 GMT, Fernando Guallini <fguall...@openjdk.org> 
wrote:

>> The manual test Cipher/DES/PerformanceTest.java fails with 
>> ArithmeticException due to potential division by zero. The issue arises when 
>> calculating the elapsed time using end - start, which could result in zero 
>> milliseconds if start and end are identical due to the high speed of 
>> execution. This leads to a division error in the following code snippet:
>> 
>> 
>> start = System.currentTimeMillis();
>> end = System.currentTimeMillis();
>> int speed = (int)((data.length * count)/(end - start));
>> 
>> This issue is easily reproducible on platforms where 
>> System.currentTimeMillis() has low granularity, such as many versions of 
>> Windows, end and start can be equal when obtaining 
>> System.currentTimeMillis() if the test runs very quickly.
>> 
>> The fix is to use System.nanoTime() instead, which is designed to measure 
>> elapsed time with very high precision. This value is then converted to 
>> microseconds so the tests can properly calculate the throughput (bytes 
>> processed per microsecond) for the report. Example output:
>> 
>> 
>> Algorithm                      DataSize Rounds Bytes/microsec
>> DES/ECB/NoPadding               1024    100       66
>> DES/ECB/NoPadding               1024    1000      50
>> DES/ECB/NoPadding               8192    100       70
>> DES/ECB/NoPadding               8192    1000      70
>> Average:                                            64
>
> Fernando Guallini has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   byter per microsec

While this should work for the systems we use, be aware that it's not 
guaranteed by the Java API.  From the `System` javadoc:

> public static long nanoTime()
>
> This method provides nanosecond precision, but not necessarily nanosecond 
> resolution (that is, how frequently the value changes) - no guarantees are 
> made except that the resolution is at least as good as that of 
> [currentTimeMillis()](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/System.html#currentTimeMillis()).

It's probably fine, or you could also use the !=0?end-start:1 hack as a backup.

Otherwise, LGTM.

-------------

Marked as reviewed by wetmore (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/20135#pullrequestreview-2187051660

Reply via email to