Use core affinity on windows to improve performance

This commit is contained in:
hailIulius
2016-04-27 19:35:32 +02:00
committed by Laurent Clouet
parent 32540e7712
commit be3a30facc
4 changed files with 30 additions and 0 deletions

View File

@@ -133,6 +133,10 @@ public class Windows extends OS {
Process p = builder.start();
WinProcess wproc = new WinProcess(p);
wproc.setPriority(WinProcess.PRIORITY_BELOW_NORMAL);
if (env != null) {
String cores = env.get("CORES");
wproc.setAffinity(Integer.parseInt(cores));
}
return p;
}

View File

@@ -21,6 +21,7 @@ import com.sun.jna.Library;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.BaseTSD;
import com.sun.jna.platform.win32.BaseTSD.DWORD_PTR;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinNT;
@@ -211,4 +212,13 @@ public interface Kernel32Lib extends Library {
*/
public int SetErrorMode(DWORD uMode);
/**
* See : https://msdn.microsoft.com/en-us/library/windows/desktop/ms686247%28v=vs.85%29.aspx
*
* @param hThread
* @param dwThreadAffinityMask
* @return If the function succeeds, the return value is the thread's previous affinity mask.
*/
public boolean SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask);
}

View File

@@ -26,6 +26,7 @@ import java.util.List;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.BaseTSD.DWORD_PTR;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.Kernel32Util;
import com.sun.jna.platform.win32.WinDef.DWORD;
@@ -121,6 +122,20 @@ public class WinProcess {
return this.kernel32lib.SetPriorityClass(this.handle, priority);
}
public boolean setAffinity(int numberCores) {
// affects the process to a specific core/cpu, it will reduce the number of switch between core
// that way the machine will look "less busy" since default behavior for windows is to put 4 cores
// at 25% instead of 1 core at 100% but from the user point of view, it introduce lag.
if (numberCores > 0) {
long coreAffinity = 0;
for (int i = 0; i < numberCores; i++) {
coreAffinity |= 1L << i;
}
return this.kernel32lib.SetProcessAffinityMask(this.handle, new DWORD_PTR(coreAffinity));
}
return false;
}
private void terminate() {
Kernel32.INSTANCE.TerminateProcess(this.handle, 0);
Kernel32.INSTANCE.CloseHandle(this.handle); // we are sure that the parent Process object is dead