using BenchmarkTools using Random using Statistics using LinearAlgebra using Plots A = 2 * rand(10^7) T_bench= @benchmark sqrt(mean(A .^ 2.)) T_bench2= @benchmark sqrt(sum(x->x*x, A)/ length( A )) T_bench3= @benchmark norm(A) / sqrt(length(A)) histogram( T_bench.times )Inlining C code, though the video cut the right edge off and I had to guess at what was missing,
using Libdl C_code = """ #include <stddef.h> #include <math.h> double c_rms(size_t n, double * X) { double s= 0.0 ; for ( size_t i= n ; ( i -- ) ; X ++ ) { s += ( *X * *X ) ; } return sqrt( s / n ) ; } double c_rmse(size_t n, double * X) { double s= 0.0 ; for ( size_t i= 0 ; ( i < n ) ; i ++ ) { s += X[i] * X[i] ; } return sqrt( s / n ) ; } """ const Clib = tempname() open( `gcc -fPIC -O3 -msse3 -xc -shared -ffast-math -o $(Clib * "." * Libdl.dlext) -`, "w" ) do f print(f, C_code) end c_rms( X::Array{Float64}) = ccall((:c_rms, C_lib), Float64, (Csize_t, Ptr{Float64},), length(X), X ) c_rmse( X::Array{Float64}) = ccall((:c_rmse, C_lib), Float64, (Csize_t, Ptr{Float64},), length(X), X ) c_rms( A )And finally, some parallel coding in Julia,
function rms(A) s = zero(eltype(A)) # generic versiion @simd for e in A s += e * e end sqrt( s / length(A) ) endTo try these pluto notebooks out without having to have Julia running locally, there's a Binder transform here, but I think I may eventually setup a pluto instance on my server.
Labels: julia
Feb '04
Oops I dropped by satellite.
New Jets create excitement in the air.
The audience is not listening.
Mar '04
Neat chemicals you don't want to mess with.
The Lack of Practise Effect
Apr '04
Scramjets take to the air
Doing dangerous things in the fire.
The Real Way to get a job
May '04
Checking out cool tools (with the kids)
A master geek (Ink Tank flashback)
How to play with your kids