Table of Contents

Backend profiles — Managed C# and OpenBLAS

Both profiles use the same operation/dtype/N/scenario schema and the same single-threaded NumPy baseline. missing_backend and not_supported are availability outcomes, never timed failures.

OpenBLAS backend: C:\Users\ELI\AppData\Local\Temp\dotnet\runfile\app-c3b80689652f6d539fa08543e6c9e4277204935d5b149c15f879e1ce51c9d9b5\bin\release\runtimes\win-x64\native\libscipy_openblas64_.dll [symbols scipy_*64_, ILP64, threads 1] OpenBLAS 0.3.31.dev USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell MAX_THREADS=24

Operation Size Managed C# OpenBLAS NumPy ms Best NPY/NS
a.dot(b) [ndarray] 1,000 0.0004 ms 0.0006 ms 0.0004 1.000x
a.dot(b) [ndarray] 100,000 0.0122 ms 0.0122 ms 0.0068 0.557x
a.dot(b) [ndarray] 10,000,000 7.5925 ms 8.3942 ms 8.3031 1.094x
np.convolve(a, kernel) 1,000 0.0131 ms 0.0424 ms 0.0235 1.794x
np.convolve(a, kernel) 100,000 0.3791 ms 1.9148 ms 2.2177 5.850x
np.convolve(a, kernel) 10,000,000 46.4639 ms 206.6472 ms 199.3455 4.290x
np.correlate(a, kernel) 1,000 0.0043 ms 0.0332 ms 0.0224 5.209x
np.correlate(a, kernel) 100,000 0.3706 ms 1.9150 ms 2.1965 5.927x
np.correlate(a, kernel) 10,000,000 46.2195 ms 166.2216 ms 206.0500 4.458x
np.dot(a, b) 1,000 0.0004 ms 0.0007 ms 0.0005 1.250x
np.dot(a, b) 100,000 0.0122 ms 0.0122 ms 0.0069 0.566x
np.dot(a, b) 10,000,000 7.9269 ms 4.4499 ms 7.4223 1.668x
np.einsum('ij,jk->ik', a, b) 1,000 0.0039 ms 0.0021 ms 0.0061 2.905x
np.einsum('ij,jk->ik', a, b) 100,000 3.8778 ms 2.2524 ms 5.1769 2.298x
np.einsum('ij,jk->ik', a, b) 10,000,000 6.4587 ms 4.0000 ms 9.6582 2.415x
np.einsum(subscripts, operands) 1,000 0.0024 ms 0.0011 ms 0.0014 1.273x
np.einsum(subscripts, operands) 100,000 0.0134 ms 0.0134 ms 0.0394 2.940x
np.einsum(subscripts, operands) 10,000,000 8.4578 ms 8.4570 ms 9.2857 1.098x
np.inner(a, b) 1,000 0.0004 ms 0.0007 ms 0.0006 1.500x
np.inner(a, b) 100,000 0.0122 ms 0.0122 ms 0.0070 0.574x
np.inner(a, b) 10,000,000 7.9907 ms 7.6714 ms 8.3426 1.087x
np.linalg.cholesky(a) 1,000 missing_backend 0.0034 ms 0.0043 1.265x
np.linalg.cholesky(a) 100,000 missing_backend 0.0326 ms 0.0174 0.534x
np.linalg.cholesky(a) 10,000,000 missing_backend 0.0680 ms 0.1038 1.526x
np.linalg.cond(a) 1,000 missing_backend 0.0533 ms 0.0349 0.655x
np.linalg.cond(a) 100,000 missing_backend 0.4661 ms 0.4757 1.021x
np.linalg.cond(a) 10,000,000 missing_backend 0.9824 ms 0.9891 1.007x
np.linalg.det(a) 1,000 0.0043 ms 0.0080 ms 0.0126 2.930x
np.linalg.det(a) 100,000 0.0728 ms 0.0543 ms 0.0587 1.081x
np.linalg.det(a) 10,000,000 0.1875 ms 0.1129 ms 0.1187 1.051x
np.linalg.eig(a) 1,000 missing_backend 0.1941 ms 0.2033 1.047x
np.linalg.eig(a) 100,000 missing_backend 2.6725 ms 2.6986 1.010x
np.linalg.eig(a) 10,000,000 missing_backend 5.8937 ms 5.8331 0.990x
np.linalg.eigh(a) 1,000 missing_backend 0.0847 ms 0.0463 0.547x
np.linalg.eigh(a) 100,000 missing_backend 0.8180 ms 0.4004 0.489x
np.linalg.eigh(a) 10,000,000 missing_backend 1.5346 ms 1.5458 1.007x
np.linalg.eigvals(a) 1,000 missing_backend 0.1109 ms 0.1279 1.153x
np.linalg.eigvals(a) 100,000 missing_backend 1.5514 ms 1.5435 0.995x
np.linalg.eigvals(a) 10,000,000 missing_backend 3.2028 ms 3.0426 0.950x
np.linalg.eigvalsh(a) 1,000 missing_backend 0.0294 ms 0.0366 1.245x
np.linalg.eigvalsh(a) 100,000 missing_backend 0.2839 ms 0.2893 1.019x
np.linalg.eigvalsh(a) 10,000,000 missing_backend 0.5183 ms 0.5261 1.015x
np.linalg.inv(a) 1,000 0.0125 ms 0.0157 ms 0.0239 1.912x
np.linalg.inv(a) 100,000 0.2485 ms 0.1604 ms 0.1823 1.137x
np.linalg.inv(a) 10,000,000 0.5972 ms 0.3403 ms 0.3679 1.081x
np.linalg.lstsq(a, b) 1,000 missing_backend 0.1518 ms 0.1637 1.078x
np.linalg.lstsq(a, b) 100,000 missing_backend 1.6220 ms 1.6285 1.004x
np.linalg.lstsq(a, b) 10,000,000 missing_backend 2.9606 ms 2.9627 1.001x
np.linalg.matmul(a, b) 1,000 0.0036 ms 0.0016 ms 0.0023 1.437x
np.linalg.matmul(a, b) 100,000 3.8721 ms 2.2462 ms 2.2518 1.002x
np.linalg.matmul(a, b) 10,000,000 6.4165 ms 3.9929 ms 4.2537 1.065x
np.linalg.matrix_norm(a, ord=2) 1,000 missing_backend 0.0532 ms 0.0695 1.306x
np.linalg.matrix_norm(a, ord=2) 100,000 missing_backend 0.4653 ms 0.4811 1.034x
np.linalg.matrix_norm(a, ord=2) 10,000,000 missing_backend 0.9814 ms 0.9909 1.010x
np.linalg.matrix_power(a, -1) 1,000 0.0133 ms 0.0165 ms 0.0257 1.932x
np.linalg.matrix_power(a, -1) 100,000 0.2505 ms 0.1635 ms 0.1843 1.127x
np.linalg.matrix_power(a, -1) 10,000,000 0.6002 ms 0.3473 ms 0.3715 1.070x
np.linalg.matrix_power(a, 3) 1,000 0.0155 ms 0.0078 ms 0.0052 0.667x
np.linalg.matrix_power(a, 3) 100,000 0.7173 ms 0.3164 ms 0.3235 1.022x
np.linalg.matrix_power(a, 3) 10,000,000 0.7173 ms 0.3163 ms 0.3239 1.024x
np.linalg.matrix_rank(a) 1,000 missing_backend 0.0559 ms 0.0717 1.283x
np.linalg.matrix_rank(a) 100,000 missing_backend 0.4716 ms 0.4822 1.022x
np.linalg.matrix_rank(a) 10,000,000 missing_backend 0.9822 ms 0.9950 1.013x
np.linalg.multi_dot(arrays) 1,000 0.0157 ms 0.0078 ms 0.0051 0.654x
np.linalg.multi_dot(arrays) 100,000 0.7175 ms 0.3163 ms 0.3291 1.040x
np.linalg.multi_dot(arrays) 10,000,000 0.7174 ms 0.3166 ms 0.3290 1.039x
np.linalg.norm(a, ord=2) 1,000 missing_backend 0.0319 ms 0.0696 2.182x
np.linalg.norm(a, ord=2) 100,000 missing_backend 0.4662 ms 0.4809 1.032x
np.linalg.norm(a, ord=2) 10,000,000 missing_backend 0.9787 ms 0.9930 1.015x
np.linalg.pinv(a) 1,000 missing_backend 0.1601 ms 0.0845 0.528x
np.linalg.pinv(a) 100,000 missing_backend 1.5796 ms 1.5793 1.000x
np.linalg.pinv(a) 10,000,000 missing_backend 3.0850 ms 3.2965 1.069x
np.linalg.qr(a) 1,000 missing_backend 0.0333 ms 0.0225 0.676x
np.linalg.qr(a) 100,000 missing_backend 0.3141 ms 0.3839 1.222x
np.linalg.qr(a) 10,000,000 missing_backend 0.6888 ms 0.7958 1.155x
np.linalg.slogdet(a) 1,000 0.0046 ms 0.0080 ms 0.0144 3.130x
np.linalg.slogdet(a) 100,000 0.0322 ms 0.0548 ms 0.0604 1.876x
np.linalg.slogdet(a) 10,000,000 0.1889 ms 0.1133 ms 0.1195 1.055x
np.linalg.solve(a, b) 1,000 0.0071 ms 0.0083 ms 0.0071 1.000x
np.linalg.solve(a, b) 100,000 0.0464 ms 0.0579 ms 0.0640 1.379x
np.linalg.solve(a, b) 10,000,000 0.2406 ms 0.1187 ms 0.1247 1.051x
np.linalg.svd(a) 1,000 missing_backend 0.1357 ms 0.1490 1.098x
np.linalg.svd(a) 100,000 missing_backend 1.4284 ms 1.4689 1.028x
np.linalg.svd(a) 10,000,000 missing_backend 2.7944 ms 2.9843 1.068x
np.linalg.svdvals(a) 1,000 missing_backend 0.0474 ms 0.0558 1.177x
np.linalg.svdvals(a) 100,000 missing_backend 0.4632 ms 0.4667 1.008x
np.linalg.svdvals(a) 10,000,000 missing_backend 0.9755 ms 0.9773 1.002x
np.linalg.tensordot(a, b) 1,000 0.0041 ms 0.0048 ms 0.0056 1.366x
np.linalg.tensordot(a, b) 100,000 0.3594 ms 0.1591 ms 0.1721 1.082x
np.linalg.tensordot(a, b) 10,000,000 0.3621 ms 0.1591 ms 0.1721 1.082x
np.linalg.tensorinv(a) 1,000 0.0128 ms 0.0158 ms 0.0259 2.023x
np.linalg.tensorinv(a) 100,000 0.2490 ms 0.1609 ms 0.1845 1.147x
np.linalg.tensorinv(a) 10,000,000 0.5967 ms 0.3431 ms 0.3720 1.084x
np.linalg.tensorsolve(a, b) 1,000 0.0076 ms 0.0089 ms 0.0184 2.421x
np.linalg.tensorsolve(a, b) 100,000 0.1032 ms 0.0587 ms 0.0667 1.136x
np.linalg.tensorsolve(a, b) 10,000,000 0.2408 ms 0.1198 ms 0.1276 1.065x
np.linalg.vecdot(a, b) 1,000 0.0018 ms 0.0008 ms 0.0008 1.000x
np.linalg.vecdot(a, b) 100,000 0.0341 ms 0.0123 ms 0.0073 0.593x
np.linalg.vecdot(a, b) 10,000,000 29.2990 ms 8.4696 ms 8.4273 0.995x
np.matmul(a, b) 1,000 0.0036 ms 0.0016 ms 0.0022 1.375x
np.matmul(a, b) 100,000 3.8830 ms 2.2470 ms 2.2609 1.006x
np.matmul(a, b) 10,000,000 6.5035 ms 3.9891 ms 4.2523 1.066x
np.matvec(a, b) 1,000 0.0010 ms 0.0004 ms 0.0007 1.750x
np.matvec(a, b) 100,000 0.0155 ms 0.0098 ms 0.0116 1.184x
np.matvec(a, b) 10,000,000 0.0216 ms 0.0142 ms 0.0162 1.141x
np.polyfit(x, y, 3) 1,000 missing_backend 0.0660 ms 0.0448 0.679x
np.polyfit(x, y, 3) 100,000 missing_backend 1.1174 ms 0.8973 0.803x
np.polyfit(x, y, 3) 10,000,000 missing_backend 7.0263 ms 8.5729 1.220x
np.roots(p) 1,000 missing_backend 0.0736 ms 0.0878 1.193x
np.roots(p) 100,000 missing_backend 0.1891 ms 0.2035 1.076x
np.roots(p) 10,000,000 missing_backend 0.7742 ms 0.7704 0.995x
np.tensordot(a, b) 1,000 0.0013 ms 0.0013 ms 0.0036 2.769x
np.tensordot(a, b) 100,000 0.0134 ms 0.0134 ms 0.0209 1.560x
np.tensordot(a, b) 10,000,000 7.2145 ms 7.7939 ms 8.5836 1.190x
np.tensordot(a, b, axes=1) 1,000 0.0041 ms 0.0048 ms 0.0054 1.317x
np.tensordot(a, b, axes=1) 100,000 3.8851 ms 2.2485 ms 2.2798 1.014x
np.tensordot(a, b, axes=1) 10,000,000 6.4310 ms 3.9968 ms 4.2931 1.074x
np.vdot(a, b) 1,000 0.0010 ms 0.0007 ms 0.0005 0.714x
np.vdot(a, b) 100,000 0.0125 ms 0.0122 ms 0.0070 0.574x
np.vdot(a, b) 10,000,000 7.9176 ms 8.2873 ms 8.3329 1.052x
np.vecdot(a, b) 1,000 0.0026 ms 0.0008 ms 0.0006 0.750x
np.vecdot(a, b) 100,000 0.0341 ms 0.0123 ms 0.0070 0.569x
np.vecdot(a, b) 10,000,000 29.1383 ms 8.4108 ms 8.2750 0.984x
np.vecmat(a, b) 1,000 0.0009 ms 0.0004 ms 0.0007 1.750x
np.vecmat(a, b) 100,000 0.0098 ms 0.0117 ms 0.0136 1.388x
np.vecmat(a, b) 10,000,000 0.0272 ms 0.0176 ms 0.0194 1.102x