5
5
[ ![ Build Status] ( https://travis-ci.org/JuliaArrays/StaticArrays.jl.svg?branch=master )] ( https://travis-ci.org/JuliaArrays/StaticArrays.jl )
6
6
[ ![ Build status] ( https://ci.appveyor.com/api/projects/status/xabgh1yhsjxlp30d?svg=true )] ( https://ci.appveyor.com/project/JuliaArrays/staticarrays-jl )
7
7
[ ![ Coverage Status] ( https://coveralls.io/repos/github/JuliaArrays/StaticArrays.jl/badge.svg?branch=master )] ( https://coveralls.io/github/JuliaArrays/StaticArrays.jl?branch=master )
8
- [ ![ codecov.io] ( http ://codecov.io/github/JuliaArrays/StaticArrays.jl/coverage.svg? branch= master)] ( http://codecov.io/github/JuliaArrays/StaticArrays.jl? branch= master )
8
+ [ ![ codecov.io] ( https ://codecov.io/github/JuliaArrays/StaticArrays.jl/branch/ master/graph/badge.svg )] ( http://codecov.io/github/JuliaArrays/StaticArrays.jl/ branch/ master )
9
9
[ ![ ] ( https://img.shields.io/badge/docs-latest-blue.svg )] ( https://JuliaArrays.github.io/StaticArrays.jl/latest )
10
10
[ ![ ] ( https://img.shields.io/badge/docs-stable-blue.svg )] ( https://JuliaArrays.github.io/StaticArrays.jl/stable )
11
11
12
12
** StaticArrays** provides a framework for implementing statically sized arrays
13
- in Julia (≥ 0.5) , using the abstract type ` StaticArray{Size,T,N} <: AbstractArray{T,N} ` .
13
+ in Julia, using the abstract type ` StaticArray{Size,T,N} <: AbstractArray{T,N} ` .
14
14
Subtypes of ` StaticArray ` will provide fast implementations of common array and
15
15
linear algebra operations. Note that here "statically sized" means that the
16
16
size can be determined from the * type* , and "static" does ** not** necessarily
@@ -27,40 +27,42 @@ Full documentation can be found [here](https://JuliaArrays.github.io/StaticArray
27
27
## Speed
28
28
29
29
The speed of * small* ` SVector ` s, ` SMatrix ` s and ` SArray ` s is often > 10 × faster
30
- than ` Base.Array ` . See this simplified benchmark (or see the full results [ here] ( https://github.com/andyferris/StaticArrays.jl/blob/master/perf/bench10.txt ) ):
30
+ than ` Base.Array ` . For example, here's a
31
+ [ microbenchmark] ( perf/README_benchmarks.jl ) showing some common operations.
31
32
32
33
```
33
34
============================================
34
35
Benchmarks for 3×3 Float64 matrices
35
36
============================================
36
-
37
- Matrix multiplication -> 8.2x speedup
38
- Matrix multiplication (mutating) -> 3.1x speedup
39
- Matrix addition -> 45x speedup
40
- Matrix addition (mutating) -> 5.1x speedup
41
- Matrix determinant -> 170x speedup
42
- Matrix inverse -> 125x speedup
43
- Matrix symmetric eigendecomposition -> 82x speedup
44
- Matrix Cholesky decomposition -> 23.6x speedup
37
+ Matrix multiplication -> 5.9x speedup
38
+ Matrix multiplication (mutating) -> 1.8x speedup
39
+ Matrix addition -> 33.1x speedup
40
+ Matrix addition (mutating) -> 2.5x speedup
41
+ Matrix determinant -> 112.9x speedup
42
+ Matrix inverse -> 67.8x speedup
43
+ Matrix symmetric eigendecomposition -> 25.0x speedup
44
+ Matrix Cholesky decomposition -> 8.8x speedup
45
+ Matrix LU decomposition -> 6.1x speedup
46
+ Matrix QR decomposition -> 65.0x speedup
45
47
```
46
48
47
- These results improve significantly when using ` julia -O3 ` with immutable static
48
- arrays, as the extra optimization results in surprisingly good SIMD code.
49
+ These numbers were generated on an Intel i7-7700HQ using Julia-1.2. As with all
50
+ synthetic benchmarks, the speedups you see here should only be taken as very
51
+ roughly indicative of the speedup you may see in real code. When in doubt,
52
+ benchmark your real application!
49
53
50
54
Note that in the current implementation, working with large ` StaticArray ` s puts a
51
55
lot of stress on the compiler, and becomes slower than ` Base.Array ` as the size
52
56
increases. A very rough rule of thumb is that you should consider using a
53
- normal ` Array ` for arrays larger than 100 elements. For example, the performance
54
- crossover point for a matrix multiply microbenchmark seems to be about 11x11 in
55
- julia 0.5 with default optimizations.
57
+ normal ` Array ` for arrays larger than 100 elements.
56
58
57
59
58
60
## Quick start
59
61
62
+ Add * StaticArrays* from the [ Pkg REPL] ( https://docs.julialang.org/en/latest/stdlib/Pkg/#Getting-Started-1 ) , i.e., ` pkg> add StaticArrays ` . Then:
60
63
``` julia
61
- Pkg. add (" StaticArrays" ) # or Pkg.clone("https://github.com/JuliaArrays/StaticArrays.jl")
62
- using StaticArrays
63
64
using LinearAlgebra
65
+ using StaticArrays
64
66
65
67
# Use the convenience constructor type `SA` to create vectors and matrices
66
68
SA[1 , 2 , 3 ] isa SVector{3 ,Int}
@@ -111,7 +113,8 @@ rand(MMatrix{20,20}) * rand(MMatrix{20,20}) # large matrices can use BLAS
111
113
eigen (m3) # eigen(), etc uses specialized algorithms up to 3×3, or else LAPACK
112
114
113
115
# Static arrays stay statically sized, even when used by Base functions, etc:
114
- typeof (eigen (m3)) == Eigen{Float64,Float64,SArray{Tuple{3 ,3 },Float64,2 ,9 },SArray{Tuple{3 },Float64,1 ,3 }}
116
+ typeof (eigen (m3). vectors) == SMatrix{3 ,3 ,Float64,9 }
117
+ typeof (eigen (m3). values) == SVector{3 ,Float64}
115
118
116
119
# similar() returns a mutable container, while similar_type() returns a constructor:
117
120
typeof (similar (m3)) == MArray{Tuple{3 ,3 },Int64,2 ,9 } # (final parameter is length = 9)
@@ -145,27 +148,7 @@ performance optimizations may be made when the size of the array is known to the
145
148
compiler. One example of this is by loop unrolling, which has a substantial
146
149
effect on small arrays and tends to automatically trigger LLVM's SIMD
147
150
optimizations. Another way performance is boosted is by providing specialized
148
- methods for ` det ` , ` inv ` , ` eig ` and ` chol ` where the algorithm depends on the
151
+ methods for ` det ` , ` inv ` , ` eigen ` and ` cholesky ` where the algorithm depends on the
149
152
precise dimensions of the input. In combination with intelligent fallbacks to
150
153
the methods in Base, we seek to provide a comprehensive support for statically
151
154
sized arrays, large or small, that hopefully "just works".
152
-
153
- ## Relationship to * FixedSizeArrays* and * ImmutableArrays*
154
-
155
- Several existing packages for statically sized arrays have been developed for
156
- Julia, noteably * FixedSizeArrays* and * ImmutableArrays* which provided signficant
157
- inspiration for this package. Upon consultation, it has been decided to move
158
- forward with * StaticArrays* which has found a new home in the * JuliaArrays*
159
- github organization. It is recommended that new users use this package, and
160
- that existing dependent packages consider switching to * StaticArrays* sometime
161
- during the life-cycle of Julia v0.5.
162
-
163
- You can try ` using StaticArrays.FixedSizeArrays ` to add some compatibility
164
- wrappers for the most commonly used features of the * FixedSizeArrays* package,
165
- such as ` Vec ` , ` Mat ` , ` Point ` and ` @fsa ` . These wrappers do not provide a
166
- perfect interface, but may help in trying out * StaticArrays* with pre-existing
167
- code.
168
-
169
- Furthermore, ` using StaticArrays.ImmutableArrays ` will let you use the typenames
170
- from the * ImmutableArrays* package, which does not include the array size as a
171
- type parameter (e.g. ` Vector3{T} ` and ` Matrix3x3{T} ` ).
0 commit comments