package com.netsdk.demo.customize;
|
|
import java.lang.reflect.Field;
|
import java.lang.reflect.Modifier;
|
import java.util.concurrent.Executors;
|
import java.util.concurrent.ThreadPoolExecutor;
|
|
import com.netsdk.lib.NetSDKLib.SdkStructure;
|
|
|
public class CheckSize {
|
|
private static Class[] SdkClasses = null;
|
private static long startTime = 0;
|
|
/**
|
* 打印Struct大小
|
**/
|
private static void printSturctSize(Class cls) {
|
Class superClass = cls.getSuperclass();
|
if (superClass == null
|
|| !superClass.getSimpleName().equals("SdkStructure")) { // 是否继承自Structure
|
return;
|
}
|
|
for (Field field : cls.getDeclaredFields()) { // 是否为枚举类型
|
int mod = field.getModifiers();
|
if (Modifier.isFinal(mod) && Modifier.isStatic(mod)) {
|
return;
|
}
|
|
// if (field.getName().equals("dwSize"))
|
}
|
|
try {
|
SdkStructure stu = (SdkStructure) cls.newInstance();
|
System.out.printf("sizeof(%s) = %d\n", cls.getSimpleName(), stu.size());
|
} catch (Exception e) {
|
System.err.println(cls.getSimpleName());
|
}
|
}
|
|
private static class CalculateSizeTask implements Runnable {
|
|
private int no;
|
private int start;
|
private int end;
|
|
public CalculateSizeTask(int no, int start, int end) {
|
this.no = no;
|
this.start = start;
|
this.end = end;
|
}
|
|
@Override
|
public void run() {
|
for (int i = start; i < end; ++i) {
|
printSturctSize(SdkClasses[i]);
|
}
|
// System.out.println("no[" + no + "] Time:" + (System.currentTimeMillis() - startTime));
|
}
|
|
}
|
|
public static void main (String[] args) throws ClassNotFoundException {
|
Class netsdk = Class.forName("com.netsdk.lib.NetSDKLib");
|
SdkClasses = netsdk.getDeclaredClasses();
|
|
|
// startTime = System.currentTimeMillis();
|
// for (Class cls : SdkClasses) {
|
// printSturctSize(cls);
|
// }
|
|
int processorNum = Runtime.getRuntime().availableProcessors();
|
int threadDealNum = SdkClasses.length/processorNum;
|
ThreadPoolExecutor pool = (ThreadPoolExecutor)Executors.newFixedThreadPool(processorNum);
|
int start = 0;
|
int end = threadDealNum;
|
for (int i = 0; i < processorNum-1; ++i) {
|
pool.execute(new CalculateSizeTask(i+1, start, end));
|
start += threadDealNum;
|
end += threadDealNum;
|
}
|
|
pool.execute(new CalculateSizeTask(processorNum, start, SdkClasses.length));
|
|
pool.shutdown();
|
|
// System.out.println("Time:" + (System.currentTimeMillis() - startTime));
|
}
|
}
|