Showing posts with label performance. Show all posts
Showing posts with label performance. Show all posts

Monday, 23 June 2014

RM3 Proof Of Concept for connecting C to java RM3 Engine

The Retail Mix & Match Module (RM3) Engine is a promotion rule engine that is specialized  in processing promotions. A promotion can be buy one get one or get 10% discount. To avoid coding these promotions direct in the POS/register system or Webshop, the RM3 is invented. Besides the flexibility the RM3 Engine also very fast in processing promotions. RM3 Engine can be used as java API or as a servlet. The RM3 Engine servlet can run on nearly any application server that is based on java.

To proof that the RM3 Engine could also run on a POS system, that is build on C technology a Proof of Concept is executed.

Proof Of Concept starting point:
  • Connect with a C program to the RM3 Engine
  • A minimum of 2000 promotions should be active
  • A minimum of 100.000 items should be part of the promotions
  • Discount results should be displayed per invoice line.

After a few days, we had the Proof of concept ready. The result was a C program that connected to the RM3 Engine and executed the promotion processing. The results were amazing for the performance. Calculating the promotions for an invoice with about 20 invoice lines took less than 100 milliseconds.

The following steps were executed by the C program:
  • starts a JVM instance,
  • Create RM3 Engine instance.
  • Loading 2000 promotions, which were based on 100.000 items.
  • Validate promotions
  • Push the invoice header information to the RM3 Engine
  • Push the invoice line information to the RM3 Engine
    • After each invoice line the RM3 Engine was started to calculate the promotions
  • At total
    • Start the RM3 Engine again for final calculation
  • Print invoice including discount information on invoice line level.

Tuesday, 4 February 2014

Mendix performance optimization for batch processing.

For some projects we needed to do batch updates or clone records.With Mendix 4, there is the possibility to commit a list entity objects.By using this feature it will improve the performance a lot.

In Mendix 3 it is done like the picture below.

Clone item without optimization

Note: In Mendix 3 it is not possible to create and update attributes at the same time, two activities are needed.
Explanation of the Microflow steps above. This example is limited to process 1000 records.
  1. Retrieve 1000 records
  2. For every record
    1. Create new record including update attributes, commit and refresh.



With Mendix 4, this can be improved. Performance improvement of 50% can be reached.

Explanation of the Microflow steps above. This example is limited to process 1000 records.
  1. Create a empty list
  2. Retrieve 1000 records
  3. For every record
    1. Create new record including update attributes (no commit and no refresh)
    2. Add new record to the list
  4. Finally commit the list including refresh.
    1. Refresh is needed when data needs to be displayed within screen.

In the example above the duration went from 9 seconds to 3.5 seconds.

When much more records needs to be processed it is advised to do it in batches. This can be done by setting the limit and offset at retrieve of the database entity. After the list is commited, clean the list and retrieve a new set of records from the database (see second activity in the Microflow).
Processing too many records at the same time can give memory overflow errors.

tip: When you have entities with more than 10 attributes it could be useful to use the Java clone function within the community commons from Mendix the App Store.