views:

58

answers:

1

I made a Google App Engine application as a class project in my university. Now I need to optimize it to use it commercially.

Nowadays, the code is very slow. It has only few Models with many properties in each. Before rewriting the Models code, I need to know if my application will be faster if I increase the number of Models, i.e. increase decoupling. And until what point should I consider dividing Models in other Models?

Other question, if decoupling positively affects performance, is the number of properties in a Model directly proportional to the time to fetch it from datastore?

+7  A: 

Nowadays, the code is very slow. It has only few Models with many properties in each.

Getting/Putting big objects

Since the datastore API can only put or get an object (as opposed to individual fields), each time you fetch an object for the datastore it fetches all its fields regardless if you are going to use them all at that point or not. This effect will be stronger when we write the object back to the datastore, it has to write everything even when you alter a single field in the object. (writes cost more than reads)

Before I say anything further: the proliferation of models should follow your pattern of reads and writes.

To be practical and give an example, say I am modeling the posts on a blog, where each would have a title, a date and a body (which we will rightfully assume as being much bigger than the other fields). In the straightforward object modeling, I'd have those three fields in a single class BlogPost, but I am penalized for the whole object each time I just want to read the titles (say to simply display a list of posts and construct links to the posts), or just to update the dates.

class BlogPost {
String title; String body; long date; }

So what one can do is create a class Body that would hold body, and keep a reference (a key) to it inside BlogPost.

class BlogPost {
String title;
Key<Body> body;
long date;
}

class Body {
String body;
}

Lightweight makes for efficient cross-side serialization

This also makes the BlogPost class more lightweight if I decide to serialize it and send it over the wire, e.g to send it to the web browser (to be used in JavaScript), with GWT for example.

Does increasing the number of models on Google App Engine affects performance?

Answer from Nick Johnson:

No, adding additional models will not impact performance.

Bakkal
Good answer, but you didn't explicitly address the main question: No, adding additional models will not impact performance.
Nick Johnson
I totally missed that, I'll quote your answer in an edit, thank you!
Bakkal