Benchmarks
The performance for some typical operators is summarized below. For fourth-order tensors, both Array
and SArray
use the classical Voigt form to correctly handle symmetries. The benchmakrs show that Tensor
offers performance comparable to SArray
without the hassle of using the Voigt form.
a = rand(Vec{3})
A = rand(SecondOrderTensor{3})
S = rand(SymmetricSecondOrderTensor{3})
AA = rand(FourthOrderTensor{3})
SS = rand(SymmetricFourthOrderTensor{3})
Operation | Tensor | Array | Speedup | SArray | Speedup |
---|---|---|---|---|---|
Single contraction | |||||
a ⊡ a | 2.785 ns | 9.256 ns | ×3.3 | 3.396 ns | ×1.2 |
A ⊡ a | 3.406 ns | 57.057 ns | ×17.0 | 3.406 ns | ×1.0 |
S ⊡ a | 3.406 ns | 58.024 ns | ×17.0 | 3.406 ns | ×1.0 |
Double contraction | |||||
A ⊡₂ A | 3.706 ns | 11.111 ns | ×3.0 | 3.096 ns | ×0.84 |
S ⊡₂ S | 3.095 ns | 10.188 ns | ×3.3 | 3.115 ns | ×1.0 |
AA ⊡₂ A | 7.732 ns | 83.732 ns | ×11.0 | 7.722 ns | ×1.0 |
SS ⊡₂ S | 4.077 ns | 72.728 ns | ×18.0 | 4.037 ns | ×0.99 |
Tensor product | |||||
a ⊗ a | 3.406 ns | 33.029 ns | ×9.7 | 3.406 ns | ×1.0 |
Cross product | |||||
a × a | 3.406 ns | 33.029 ns | ×9.7 | 3.406 ns | ×1.0 |
Determinant | |||||
det(A) | 3.406 ns | 168.261 ns | ×49.0 | 3.406 ns | ×1.0 |
det(S) | 3.396 ns | 171.386 ns | ×50.0 | 3.406 ns | ×1.0 |
Inverse | |||||
inv(A) | 6.252 ns | 470.724 ns | ×75.0 | 7.400 ns | ×1.2 |
inv(S) | 4.949 ns | 491.175 ns | ×99.0 | 7.400 ns | ×1.5 |
inv(AA) | 962.889 ns | 1.582 μs | ×1.6 | 951.263 ns | ×0.99 |
inv(SS) | 366.655 ns | 1.015 μs | ×2.8 | 355.498 ns | ×0.97 |
The benchmarks are generated by runbenchmarks.jl
on the following system:
julia> versioninfo()
Julia Version 1.11.3
Commit d63adeda50d (2025-01-21 19:42 UTC)
Build Info:
Official https://julialang.org/ release
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 4 × AMD EPYC 7763 64-Core Processor
WORD_SIZE: 64
LLVM: libLLVM-16.0.6 (ORCJIT, znver3)
Threads: 1 default, 0 interactive, 1 GC (on 4 virtual cores)