Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to speed up C# math code
    primarykey
    data
    text
    <p>I have some 3d interpolation code that takes up 90% of my projects runtime and cannot be precomputed.</p> <p>What are some techniques that I could use to speed this up? Algorithmic or Micro Optimization?</p> <p>Here is the code for those interested.</p> <p>It basically takes data that was placed across the 2 3d arrays and interpolates the rest of the data.</p> <p>EDIT: Also I am already spliting this into threads at a higher level for increased performance, but this doesn't help on the windows phone as they are all single core...</p> <p>I will probably do something like (Single[] DensityMap = new Single[128 * 128 * 128];) to remove the multi-D array hit. I access the array in 100's of places and was hoping to not have to do that (wrapping in a function doesn't help as the windows phone won't inline the function call and it doesn't help perf then...)</p> <pre><code>float[, ,] DensityMap = new float[128, 128, 128]; float[, ,] PressureMap = new float[128, 128, 128]; unchecked { for (int x = 0; x &lt; g_CraftWorldConstants.RegionSizeX; x++) { int offsetX = (x / SAMPLE_RATE_3D_HOR) * SAMPLE_RATE_3D_HOR; int plusOffsetX = SAMPLE_RATE_3D_HOR + offsetX; int poxox = plusOffsetX - offsetX; double poxxpoxox = ((plusOffsetX - x) / (double)poxox); double xoxpoxox = ((x - offsetX) / (double)poxox); for (int y = 0; y &lt; g_CraftWorldSettings.GET.RegionSizeY; y++) { int offsetY = (y / SAMPLE_RATE_3D_VERT) * SAMPLE_RATE_3D_VERT; int plusOffsetY = SAMPLE_RATE_3D_VERT + offsetY; int poyoy = plusOffsetY - offsetY; double poyypoyoy = ((plusOffsetY - y) / (double)poyoy); double yoypoyoy = ((y - offsetY) / (double)poyoy); for (int z = 0; z &lt; g_CraftWorldConstants.RegionSizeZ; z++) { if (!(x % SAMPLE_RATE_3D_HOR == 0 &amp;&amp; y % SAMPLE_RATE_3D_VERT == 0 &amp;&amp; z % SAMPLE_RATE_3D_HOR == 0)) { int offsetZ = (z / SAMPLE_RATE_3D_HOR) * SAMPLE_RATE_3D_HOR; int plusOffsetZ = SAMPLE_RATE_3D_HOR + offsetZ; int pozoz = plusOffsetZ - offsetZ; double pozzpozoz = ((plusOffsetZ - z) / (double)pozoz); double zozpozoz = ((z - offsetZ) / (double)pozoz); double x00 = poxxpoxox * in_DensityMap[offsetX, offsetY, offsetZ] + xoxpoxox * in_DensityMap[plusOffsetX, offsetY, offsetZ]; double x10 = poxxpoxox * in_DensityMap[offsetX, offsetY, plusOffsetZ] + xoxpoxox * in_DensityMap[plusOffsetX, offsetY, plusOffsetZ]; double x01 = poxxpoxox * in_DensityMap[offsetX, plusOffsetY, offsetZ] + xoxpoxox * in_DensityMap[plusOffsetX, plusOffsetY, offsetZ]; double x11 = poxxpoxox * in_DensityMap[offsetX, plusOffsetY, plusOffsetZ] + xoxpoxox * in_DensityMap[plusOffsetX, plusOffsetY, plusOffsetZ]; double r0 = poyypoyoy * x00 + yoypoyoy * x01; double r1 = poyypoyoy * x10 + yoypoyoy * x11; in_DensityMap[x, y, z] = (float)(pozzpozoz * r0 + zozpozoz * r1); double x02 = poxxpoxox * in_CaveDensity[offsetX, offsetY, offsetZ] + xoxpoxox * in_CaveDensity[plusOffsetX, offsetY, offsetZ]; double x12 = poxxpoxox * in_CaveDensity[offsetX, offsetY, plusOffsetZ] + xoxpoxox * in_CaveDensity[plusOffsetX, offsetY, plusOffsetZ]; double x03 = poxxpoxox * in_CaveDensity[offsetX, plusOffsetY, offsetZ] + xoxpoxox * in_CaveDensity[plusOffsetX, plusOffsetY, offsetZ]; double x13 = poxxpoxox * in_CaveDensity[offsetX, plusOffsetY, plusOffsetZ] + xoxpoxox * in_CaveDensity[plusOffsetX, plusOffsetY, plusOffsetZ]; double r2 = poyypoyoy * x02 + yoypoyoy * x03; double r3 = poyypoyoy * x12 + yoypoyoy * x13; in_CaveDensity[x, y, z] = (float)(pozzpozoz * r2 + zozpozoz * r3); } } } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload