Hi,
I'm using java NetCDF 2.2.20. One of the issues which I have related to very
low performance comparing to .Net wrapper on "C" library 3.6.1
For instance I made simple straight forward test case:
- Create a file
- 1 dimension
- 1 variable type Float
- Dump values as arrays of 5 elements
Java code:
try {
NetcdfFileWriteable ncFile =
NetcdfFileWriteable.createNew("d:\\duck2.nc", false);
Dimension timeDim = ncFile.addDimension(timeSeriesDimensionName,
-1, true, true, false);
Dimension[] dim1 = new Dimension[1];
dim1[0] = timeDim;
ncFile.addVariable("avar", DataType.FLOAT, dim1);
ncFile.create();
int c=0;
float[] arr;
arr=new float[5];
arr[0]=50;
arr[1]=40;
arr[2]=30;
arr[3]=20;
arr[4]=10;
int i, j;
for(j=0;j<2000;j++)
for(i=0;i<50000;i++){
int[] timeOrigin = new int[] {c};
ncFile.write("avar", timeOrigin, Array.factory(arr));
c+=5;
}
ncFile.flush();
ncFile.close();
}
catch(Exception ex){
}
And similar VB.NET code
Dim ncid As Integer
Dim dimid As Integer
Dim varid As Integer
Dim v(4) As Single
v(1) = 10
v(2) = 20
v(3) = 30
v(4) = 40
v(0) = 50
Dim vSize(0) As Integer
vSize(0) = 5
Dim res As Integer
Dim dims(0) As Integer
res = NetCDF.nc_create("d:\duck.nc", NetCDF.cmode.NC_WRITE, ncid)
res = NetCDF.nc_def_dim(ncid, "big_dim", 0, dimid)
dims(0) = dimid
res = NetCDF.nc_def_var(ncid, "big_var", NetCDF.nc_type.NC_FLOAT, 1,
dims, varid)
NetCDF.nc_enddef(ncid)
Dim idx(0) As Integer
Dim i As Integer
Dim j As Integer
idx(0) = 0
For j = 0 To 2000
For i = 0 To 50000
res = NetCDF.nc_put_vara_float(ncid, varid, idx, vSize, v)
idx(0) = idx(0) + vSize(0)
Next
Next
***************************
Java code is approximately 40 times slower.
Apparently, making a bigger buffer (for instance arrays of 10000 instead of 5
elements) in Java case will reduce the difference, but anyway it very
significant.
Any suggestion how to improve it?
Thanks,
Mark Balonkin