[
https://issues.apache.org/jira/browse/GEOMETRY-50?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17028257#comment-17028257
]
Matt Juntunen commented on GEOMETRY-50:
---------------------------------------
I ran some benchmarks on this with the performance tests in my PR for
GEOMETRY-75. The results below compare the current {{norm}} implementation with
one using {{SafeNorm}} for JDK 8 and 9.
{noformat}
Current - JDK 8
Benchmark (size) (type) Mode Cnt Score Error
Units
VectorPerformance.baseline 1000 random avgt 5 4186.666 ±
156.418 ns/op
VectorPerformance.norm2D 1000 random avgt 5 393488.671 ±
41310.297 ns/op
VectorPerformance.norm3D 1000 random avgt 5 4923.344 ±
217.937 ns/op
SafeNorm - JDK 8
Benchmark (size) (type) Mode Cnt Score Error
Units
VectorPerformance.baseline 1000 random avgt 5 4163.560 ± 121.299
ns/op
VectorPerformance.norm2D 1000 random avgt 5 11169.608 ± 416.842
ns/op
VectorPerformance.norm3D 1000 random avgt 5 12489.558 ± 287.116
ns/op
Current - JDK 9
Benchmark (size) (type) Mode Cnt Score Error
Units
VectorPerformance.baseline 1000 random avgt 5 4191.927 ± 262.073
ns/op
VectorPerformance.norm2D 1000 random avgt 5 20630.762 ± 905.460
ns/op
VectorPerformance.norm3D 1000 random avgt 5 5026.333 ± 375.147
ns/op
SafeNorm - JDK 9
Benchmark (size) (type) Mode Cnt Score Error
Units
VectorPerformance.baseline 1000 random avgt 5 4111.371 ± 55.975
ns/op
VectorPerformance.norm2D 1000 random avgt 5 11334.412 ± 117.637
ns/op
VectorPerformance.norm3D 1000 random avgt 5 12742.333 ± 401.728
ns/op
{noformat}
Some observations:
1. {{SafeNorm}} is considerably faster than {{Math.hypot}} in JDK 8 and
moderately faster than that in JDK 9.
2. {{SafeNorm}} applies a 2-3x performance penalty in 3D, which is to be
expected since the current implementation does no overflow/underflow checks
whatsoever.
3. The performance between the different dimensions is pretty consistent with
{{SafeNorm}}.
Overall, {{SafeNorm}} seems like a good choice. It's a performance gain in 2D
and a modest performance hit in 3D.
> Overflow in Vector norm and distance
> ------------------------------------
>
> Key: GEOMETRY-50
> URL: https://issues.apache.org/jira/browse/GEOMETRY-50
> Project: Apache Commons Geometry
> Issue Type: Bug
> Reporter: Baljit Singh
> Priority: Major
>
> In Euclidean Vector classes (Vector2D, Vector3D), norm() and distance() rely
> on Math.sqrt(), which can overflow if the components of the vectors are
> large. Instead, they should rely on SafeNorm.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)