Hello,
As a scientist, I used to program my calculations in JAVA, and since almost one
year I'm doing these using OSGI paradigm, more precisely IPOJO framework. The
programs are much more powerful, and I find huge advantages, of course. Anyhow
I have questions regarding IPOJO performance. Let me give you an example.
I) STARTING PROBLEM
I have a collection of geometric objects (say Triangle and Square), on which I
must do some computations by pairs. Technically I may write something like :
for (Geom g1 : geometricList){
for (Geom g2 : geometricList){
compute(g1,g2) ;
}
}
II) CLARITY
But because the method « compute » should clearly distinct operations when
objects are of types Triangle or Square, the code for « compute » method become
quickly huge and unreadable (furthermore you can imagine that there is other
kinds of geometric objects).
Leading to a much more readable “compute” code, I can partition my objects into
geometric categories with the following code :
for (Geom g1 : geometricList){
for (Geom g2 : TrianglesList){
computeTriangles(g1,g2) ;
}
for (Geom g2 : SquaresList){
computeSquares(g1,g2) ;
}
}
III) OSGI SOLUTION
I find that OSGI allows very simple extensions and management of this coding
structure when computeTriangles, and computeSquares are designed as OSGI
«PairGeometricServices»
for (Geom g1 : geometricList){
for (Geom g2 : TrianglesList){
pairGeometricServiceTriangles.compute (g1,g2) ;
}
for (Geom g2 : SquaresList){
pairGeometricServiceSquares.compute(g1,g2) ;
}
}
« compute » extracts some complicated geometries information on its parameters
« g1 », and « g2 », and because within the « g1 » loop, the object g1 stays the
same it seems better to write something like :
for (Geom g1 : geometricList){
pairGeometricServiceTriangles.setFirst(g1) ;
for (Geom g2 : TrianglesList){
pairGeometricServiceTriangles.compute (g2) ;
}
pairGeometricServiceSquaresInstance.
reconfigure(pairGeometricServiceTriangles.getDict()) ;
for (Geom g2 : SquaresList){
pairGeometricServiceSquares.compute(g2) ;
}
}
Now « setFirst » computes the geometries information for « g1 » and stores them
in some « ServiceProperty » of the associated « PairGeometricService ». The
line «reconfigure(...)» allows « pairGeometricSquares » to be updated with
these «ServiceProperty» values.
IV) BENCHMARKING
As I said in the beginning, I'm very happy with such OSGI's programming
structures which is easily extended and updated. Now, if we look inside the
“compute” implementation of the “PairGeometricServiceSquare” we find something
like:
…..
@ServiceProperty(name=FIRST_LENGTHS)
double[] first_lengths;
….
public void compute(Geom g2){
...
q=xx*yy*first_lentghs[i]+…;
…
}
….
That is the “ServiceProperty” values are heavily accessed within some loops.
Everything is working as expected, but profiling the (very slow) code I found
that more than 80% of the total time for the method “compute” comes from
reading the “ServiceProperty”, appearing as:
fqdnClassName._getfirst_lengths
in the profiler.
The trick is to write a line of code at the beginning of “compute”
double fl[]= first_lengths;
and then to replace “first_length” by “fl” in the code. The extra time has now
disappeared.
V) QUESTIONS
Could you let me know:
- Is there any advice about not using “ServiceProperty” fields as any other
fields, or is it a implementation artifact ?
- am I doing something wrong with OSGI framework ?
Thank you for your answers, sincerely,
JP.