# Performance discrepancy in sparse matrix product

**URL:** <https://discourse.julialang.org/t/performance-discrepancy-in-sparse-matrix-product/12048>\
**Category:** Performance\
**Created:** [June 28, 2018, 10:33pm UTC](https://discourse.julialang.org/t/performance-discrepancy-in-sparse-matrix-product/12048 "2018-06-28T22:33:06Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Sean\_McBane](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sean_mcbane/32/4580_2.png) [@Sean\_McBane](https://discourse.julialang.org/u/Sean_McBane)\
**Post date:** [June 28, 2018, 10:33pm UTC](https://discourse.julialang.org/t/performance-discrepancy-in-sparse-matrix-product/12048/1 "2018-06-28T22:33:06Z")

</div>

Hi all, I noticed the following performance discrepancy:

```julia
julia> using BenchmarkTools

julia> const A = sprand(500, 500, 0.01);

julia> const B = sprand(500, 500, 0.01);

julia> const C = full(A*B);

julia> @benchmark A*B
BenchmarkTools.Trial: 
  memory estimate: 425.88 KiB
  allocs estimate: 1495
  --------------
  minimum time: 400.802 μs (0.00% GC)
  median time: 408.625 μs (0.00% GC)
  mean time: 426.060 μs (3.16% GC)
  maximum time: 1.485 ms (56.57% GC)
  --------------
  samples: 10000
  evals/sample: 1

julia> @benchmark A_mul_B!(C, A, B)
BenchmarkTools.Trial: 
  memory estimate: 336 bytes
  allocs estimate: 6
  --------------
  minimum time: 182.815 ms (0.00% GC)
  median time: 182.990 ms (0.00% GC)
  mean time: 182.990 ms (0.00% GC)
  maximum time: 183.201 ms (0.00% GC)
  --------------
  samples: 28
  evals/sample: 1

```

The product of two sparse matrices, when creating a new sparse matrix, is an order of magnitude faster than when storing the product in a pre-allocated dense matrix, which should surely not be the case. I think that `A_mul_B!` must be falling back to a generic implementation?

---

<div class="post-metadata">

**Author:** ![simonbyrne](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/simonbyrne/32/19_2.png) [@simonbyrne](https://discourse.julialang.org/u/simonbyrne)\
**Post date:** [June 28, 2018, 10:43pm UTC](https://discourse.julialang.org/t/performance-discrepancy-in-sparse-matrix-product/12048/2 "2018-06-28T22:43:46Z")

</div>

> [@Sean\_McBane](#):
>
> I think that `A_mul_B!` must be falling back to a generic implementation?

Indeed it is:

```julia
julia> @which A_mul_B!(C, A, B)
A_mul_B!(C::AbstractArray{T,2} where T, A::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg/matmul.jl:178

```

---

<div class="post-metadata">

**Author:** ![Sean\_McBane](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sean_mcbane/32/4580_2.png) [@Sean\_McBane](https://discourse.julialang.org/u/Sean_McBane)\
**Post date:** [June 28, 2018, 10:49pm UTC](https://discourse.julialang.org/t/performance-discrepancy-in-sparse-matrix-product/12048/3 "2018-06-28T22:49:22Z")

</div>

Ah, I didn’t know the `@which` macro before. Does the specialized version exist, or would that be a good pull request?

---

<div class="post-metadata">

**Author:** ![simonbyrne](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/simonbyrne/32/19_2.png) [@simonbyrne](https://discourse.julialang.org/u/simonbyrne)\
**Post date:** [June 28, 2018, 11:09pm UTC](https://discourse.julialang.org/t/performance-discrepancy-in-sparse-matrix-product/12048/4 "2018-06-28T23:09:37Z")

</div>

No specialised version seems to exist. You are welcome to open a pull request, though note that in the development version of Julia some functions have changed (e.g. `A_mul_B!` is now `mul!`) and sparse arrays have been moved to the standard library:  
[https://github.com/JuliaLang/julia/blob/master/stdlib/SparseArrays/src/linalg.jl](https://github.com/JuliaLang/julia/blob/master/stdlib/SparseArrays/src/linalg.jl)

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [June 29, 2018, 9:37am UTC](https://discourse.julialang.org/t/performance-discrepancy-in-sparse-matrix-product/12048/5 "2018-06-29T09:37:26Z")

</div>

Also, see [https://github.com/JuliaLang/julia/pull/24045](https://github.com/JuliaLang/julia/pull/24045) which might be a good point to keep going from.
