1. 程式人生 > >Java if else 與 switch 測速

Java if else 與 switch 測速

今天做一個壓縮資料的讀取操作,裡面有一個判斷比較多的地方。

我特意用 switch 與 if else 結構 測速了速度。

   通過多次的結果:

85000 條資料15個欄位。取3次的平均值,if else 950 毫秒左右、 switch 950 毫秒左右。 寫法如下:

if else 我儘量把常用的資訊靠前寫的。

/**
* 讀取一個欄位資訊
*/
private void readOneField(Meta<BasedataField> meta, Data<BasedataField> data, Map<String,Object> rsmap,

BasedataField field){
FieldIndex<BasedataField> fi = meta.getFileIndex(field.getName());
switch(fi.getField().getType()){
case Types.CHAR:
case Types.VARCHAR:
case Types.NVARCHAR:
rsmap.put(field.getName(), data.getStringArray()[fi.getIndex()]);
break;
case Types.NUMERIC:
case Types.DOUBLE:
rsmap.put(field.getName(), data.getDoubleArray()[fi.getIndex()]);
break;
case Types.INTEGER:
rsmap.put(field.getName(), data.getIntArray()[fi.getIndex()]);
break;
case Types.DATE:
rsmap.put(field.getName(), data.getDateArray()[fi.getIndex()]);
break;
case Types.BIT:
rsmap.put(field.getName(), data.getByteArray()[fi.getIndex()]);
break;
case Types.SMALLINT:
rsmap.put(field.getName(), data.getShortArray()[fi.getIndex()]);
break;
case Types.BIGINT:
rsmap.put(field.getName(), data.getLongArray()[fi.getIndex()]);
break;
case Types.FLOAT:
rsmap.put(field.getName(), data.getFloatArray()[fi.getIndex()]);
break;
default:
throw new IllegalArgumentException("無效的資料型別:" + fi.getField().getType() + " field name="
+ fi.getField().getName());
}
}


/**
* 讀取一個欄位資訊
*/
private void readOneField2(Meta<BasedataField> meta, Data<BasedataField> data, Map<String,Object> rsmap,
BasedataField field){
FieldIndex<BasedataField> fi = meta.getFileIndex(field.getName());
if(fi.getField().getType() == Types.CHAR || fi.getField().getType() == Types.VARCHAR
|| fi.getField().getType() == Types.NVARCHAR)
rsmap.put(field.getName(), data.getStringArray()[fi.getIndex()]);
else if(fi.getField().getType() == Types.NUMERIC || fi.getField().getType() == Types.DOUBLE)
rsmap.put(field.getName(), data.getDoubleArray()[fi.getIndex()]);
else if(fi.getField().getType() == Types.INTEGER)
rsmap.put(field.getName(), data.getIntArray()[fi.getIndex()]);
else if(fi.getField().getType() == Types.DATE)
rsmap.put(field.getName(), data.getDateArray()[fi.getIndex()]);
else if(fi.getField().getType() == Types.BIT)
rsmap.put(field.getName(), data.getByteArray()[fi.getIndex()]);
else if(fi.getField().getType() == Types.SMALLINT)
rsmap.put(field.getName(), data.getShortArray()[fi.getIndex()]);
else if(fi.getField().getType() == Types.BIGINT)
rsmap.put(field.getName(), data.getLongArray()[fi.getIndex()]);
else if(fi.getField().getType() == Types.FLOAT)
rsmap.put(field.getName(), data.getFloatArray()[fi.getIndex()]);
else
throw new IllegalArgumentException("無效的資料型別:" + fi.getField().getType() + " field name="
+ fi.getField().getName());
}


所以我覺的 if else 與switch 效率是差不多的。