Hi,

> On 13 Jul 2017, at 09:11, jerome pommier <jerome.pomm...@yahoo.fr.INVALID> 
> wrote:
> 
> 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 ?

iPOJO instruments all fields to intercept reads / writes. If interception time 
is too expensive for you, you have found the solution by copying the value into 
a local variable. However, the interception methods have been designed to be 
inlined by the JIT meaning that the cost should be meaningless in most of the 
cases. When you use a profiler, I’m not sure the JIT can apply all the 
optimizations.

Clement

> - am I doing something wrong with OSGI framework ?
> 
> Thank you for your answers, sincerely,
> 
> JP.


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
For additional commands, e-mail: users-h...@felix.apache.org

Reply via email to