let MultiplyTyped (A : double[,]) (B : double[,]) =
let rA, cA = (Array2D.length1 A) - 1, (Array2D.length2 A) - 1
let cB = (Array2D.length2 B) - 1
let C = Array2D.zeroCreate<double> (Array2D.length1 A) (Array2D.length2 B)
for i = 0 to rA do
for k = 0 to cA do
for j = 0 to cB do
C.[i,j] <- C.[i,j] + A.[i,k] * B.[k,j]
C
let inline MultiplyGeneric (A : 'T[,]) (B : 'T[,]) =
let rA, cA = Array2D.length1 A - 1, Array2D.length2 A - 1
let cB = Array2D.length2 B - 1
let C = Array2D.zeroCreate<'T> (Array2D.length1 A) (Array2D.length2 B)
for i = 0 to rA do
for k = 0 to cA do
for j = 0 to cB do
C.[i,j] <- C.[i,j] + A.[i,k] * B.[k,j]
C
let test f =
let sw = System.Diagnostics.Stopwatch.StartNew()
f() |> ignore
sw.Stop()
printfn "%A" sw.Elapsed
let r = new System.Random()
let A = Array2D.init 512 512 (fun i j -> r.NextDouble())
let B = Array2D.init 512 512 (fun i j -> r.NextDouble())
//for i = 1 to 5 do
test (fun () -> MultiplyTyped A B)
//for i = 1 to 5 do
test (fun () -> MultiplyGeneric A B)
bGV0IE11bHRpcGx5VHlwZWQgKEEgOiBkb3VibGVbLF0pIChCIDogZG91YmxlWyxdKSA9CiAgICBsZXQgckEsIGNBID0gKEFycmF5MkQubGVuZ3RoMSBBKSAtIDEsIChBcnJheTJELmxlbmd0aDIgQSkgLSAxCiAgICBsZXQgY0IgPSAoQXJyYXkyRC5sZW5ndGgyIEIpIC0gMQogICAgbGV0IEMgPSBBcnJheTJELnplcm9DcmVhdGU8ZG91YmxlPiAoQXJyYXkyRC5sZW5ndGgxIEEpIChBcnJheTJELmxlbmd0aDIgQikKICAgIGZvciBpID0gMCB0byByQSBkbwogICAgICAgIGZvciBrID0gMCB0byBjQSBkbwogICAgICAgICAgICBmb3IgaiA9IDAgdG8gY0IgZG8KICAgICAgICAgICAgICAgIEMuW2ksal0gPC0gQy5baSxqXSArIEEuW2ksa10gKiBCLltrLGpdCiAgICBDCgpsZXQgaW5saW5lIE11bHRpcGx5R2VuZXJpYyAoQSA6ICdUWyxdKSAoQiA6ICdUWyxdKSA9CiAgICBsZXQgckEsIGNBID0gQXJyYXkyRC5sZW5ndGgxIEEgLSAxLCBBcnJheTJELmxlbmd0aDIgQSAtIDEKICAgIGxldCBjQiA9IEFycmF5MkQubGVuZ3RoMiBCIC0gMQogICAgbGV0IEMgPSBBcnJheTJELnplcm9DcmVhdGU8J1Q+IChBcnJheTJELmxlbmd0aDEgQSkgKEFycmF5MkQubGVuZ3RoMiBCKQogICAgZm9yIGkgPSAwIHRvIHJBIGRvCiAgICAgICAgZm9yIGsgPSAwIHRvIGNBIGRvCiAgICAgICAgICAgIGZvciBqID0gMCB0byBjQiBkbwogICAgICAgICAgICAgICAgQy5baSxqXSA8LSBDLltpLGpdICsgQS5baSxrXSAqIEIuW2ssal0gCiAgICBDCgpsZXQgdGVzdCBmID0KICBsZXQgc3cgPSBTeXN0ZW0uRGlhZ25vc3RpY3MuU3RvcHdhdGNoLlN0YXJ0TmV3KCkKICBmKCkgfD4gaWdub3JlCiAgc3cuU3RvcCgpCiAgcHJpbnRmbiAiJUEiIHN3LkVsYXBzZWQKCmxldCByID0gbmV3IFN5c3RlbS5SYW5kb20oKQpsZXQgQSA9IEFycmF5MkQuaW5pdCA1MTIgNTEyIChmdW4gaSBqIC0+IHIuTmV4dERvdWJsZSgpKQpsZXQgQiA9IEFycmF5MkQuaW5pdCA1MTIgNTEyIChmdW4gaSBqIC0+IHIuTmV4dERvdWJsZSgpKQoKLy9mb3IgaSA9IDEgdG8gNSBkbwp0ZXN0IChmdW4gKCkgLT4gTXVsdGlwbHlUeXBlZCBBIEIpCgovL2ZvciBpID0gMSB0byA1IGRvCnRlc3QgKGZ1biAoKSAtPiBNdWx0aXBseUdlbmVyaWMgQSBCKQo=