JNI:Performance:Suggestions/Advice needed

Discussion in 'Java' started by Ganesh, Apr 3, 2004.

  1. Ganesh

    Ganesh Guest

    Hi
    I have an issue which I am unable to decide on regarding JNI. Would be
    glad if someone could help me out.
    This is the requirement:

    I need to pass around 20 values, all belonging to different logical
    sets (for eg., 4 are related to employee details, 3 are related to
    salary details etc). which finally belong to a larger logical image
    (company information) from the java side to the c++ side for
    processing.

    I have 2 ways to do this
    1. Make objects of all relevant information in the Java side, a Salary
    class which will contain all salary details, an Employee class with
    all employee information, and store all these in a single object
    called CompanyInfo (say). I pass this object to the C++ side, which
    a. uses the main object and get all the objects inside such as
    salary, employee etc.
    b. Calls the get methods of salary object, employee object etc. to
    retrieve all the values required for processing.
    C. Does processing using the required values.

    2. Store _all_ the values required for the operation in a single
    array/arraylist and pass it to the C++ side. C++ side retrieves it in
    a pre-determined order, gets the values and does the processing.

    Now, I am inclined towards 1 since the code will be well-organized,
    objectified and easy to maintain. The whole design follows a logical,
    constructive pattern. Whereas 2 looks crude, with everything dumped
    into 1 array with no logical separation resulting in bad code which is
    touhg to understand and maintain.

    My problem is that I am worried about the effect on performance if I
    choose 1. If 20 values are to be retrieved, then 20 callback
    operations (from C++ to JNI) have to be done to call the get methods
    and the values have to be got. How costly would this turn out to be?
    Will option 2 be drastically cheaper in terms of time taken?

    My test programs don't reveal much as there is hardly any load. This
    logic will go into a web-app which will be used by thousands of users
    concurrently, so could anybody please advise on which would the better
    option from a performance viewpoint?

    Or is there a different solution to this requirement?

    If i take method 1, what about having one get method in each object
    which will return an array of all the values stored in it? kinda
    midway solution, I thought.

    Wud be great if someone cud help me out.

    Thanks and Regards
    Ganesh
     
    Ganesh, Apr 3, 2004
    #1
    1. Advertising

  2. Ganesh

    Roedy Green Guest

    On 2 Apr 2004 19:29:43 -0800, (Ganesh) wrote or
    quoted :

    >Now, I am inclined towards 1 since the code will be well-organized,
    >objectified and easy to maintain.


    What you want to do is keep the number of C calls to Java methods and
    Java methods to C to a minimum. There is a whacking PER CALL overhead.

    For max efficiency then, you pass a single blob to C that C can
    process directly, rather than using accessors to call back field by
    field to Java. That blob might represent a C struct, complete with
    little endian data. From Java's point of view it might be a byte[]
    composed with LEDataOutputStream. See
    http://mindprod.com/jgloss/ledatastream.html


    Before you go to such pain, make sure you truly need the speed by
    doing some profiling to make sure this truly is a bottleneck.


    --
    Canadian Mind Products, Roedy Green.
    Coaching, problem solving, economical contract programming.
    See http://mindprod.com/jgloss/jgloss.html for The Java Glossary.
     
    Roedy Green, Apr 3, 2004
    #2
    1. Advertising

  3. Ganesh

    Chris Uppal Guest

    Ganesh wrote:

    > Now, I am inclined towards 1 since the code will be well-organized,
    > objectified and easy to maintain. The whole design follows a logical,
    > constructive pattern. Whereas 2 looks crude, with everything dumped
    > into 1 array with no logical separation resulting in bad code which is
    > touhg to understand and maintain.


    Stick with the clean solution until you *know* you have a performance problem.
    What's more, stick with it until you know that you have a problem *and* that it
    can be cured (or significantly alleviated) by this sort of micro-optimisation.
    Personally, I suspect that it's unlikely to help -- we are only talking about a
    few micro-seconds difference (depending on the machine/JVM of course) and it
    takes an *awful* lot of repetitions before that adds up to anything noticable.

    If you *do* discover that you have problems, then the first step is to ensure
    that you don't call the accessor methods more often that you have to -- i.e.
    get the data out *once* in your C/C++ code, and keep it around for as long as
    you need it.

    If that doesn't work, then it's worth remembering that JNI igores Java's access
    controls, so you can just read the values of the fields directly. That's
    unclean, of course, but still better than mucking about with arrays (and, in
    any case, I think that reading a field from JNI is about as fast as reading an
    element from an array -- but don't take my word for that).

    -- chris
     
    Chris Uppal, Apr 3, 2004
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Alex Hunsley

    IBM's JNI fails where Sun's JNI works

    Alex Hunsley, Nov 3, 2003, in forum: Java
    Replies:
    4
    Views:
    882
    Alex Hunsley
    Nov 4, 2003
  2. Pasturel Jean-Louis

    Porting JNI Windows under JNI LINUX + Wine ?

    Pasturel Jean-Louis, Feb 29, 2004, in forum: Java
    Replies:
    5
    Views:
    943
    Pasturel Jean-Louis
    Mar 3, 2004
  3. Ganesh
    Replies:
    0
    Views:
    354
    Ganesh
    Apr 3, 2004
  4. vasanth
    Replies:
    0
    Views:
    2,780
    vasanth
    Jan 25, 2005
  5. vasanth
    Replies:
    0
    Views:
    639
    vasanth
    Jan 25, 2005
Loading...

Share This Page