Skip to content

Instantly share code, notes, and snippets.

@stepancheg
Created December 11, 2014 00:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stepancheg/0ef5ba9f347ffda1e88f to your computer and use it in GitHub Desktop.
Save stepancheg/0ef5ba9f347ffda1e88f to your computer and use it in GitHub Desktop.
package ru.yandex.salmon.util.spring.mongo;
import java.lang.reflect.Field;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
/**
* @author Stepan Koltsov
*/
public class SpringMongoConverterPerf {
static {
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
e.printStackTrace();
// because on-exit hooks may hang
Runtime.getRuntime().halt(1);
}
});
}
public static class Foo {
private final long id;
private final String payload;
public Foo(long id, String payload) {
this.id = id;
this.payload = payload;
}
public long getId() {
return id;
}
public String getPayload() {
return payload;
}
}
public static void main(String[] args) throws Exception {
MongoTemplate mongoTemplate = new MongoTemplate(new MongoClient("doesn't matter"), "foobar");
MongoConverter converter = mongoTemplate.getConverter();
Field idField = Foo.class.getDeclaredField("id");
idField.setAccessible(true);
Field payloadField = Foo.class.getDeclaredField("payload");
payloadField.setAccessible(true);
String[] fieldNames = new String[] { "_id", "payload" };
Field[] fields = new Field[] { idField, payloadField };
Foo foo = new Foo(10, "data");
DBObject dbObject = (DBObject) converter.convertToMongoType(foo);
System.out.println(dbObject);
for (;;) {
measure("auto", () -> converter.convertToMongoType(foo));
//measure("auto back", () -> mongoTemplate.getConverter().read(Foo.class, dbObject));
measure("hand", () -> {
try {
BasicDBObject r = new BasicDBObject();
for (int i = 0; i < fieldNames.length; ++i) {
String fieldName = fieldNames[i];
Field field = fields[i];
r.put(fieldName, field.get(foo));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}
}
private static void measure(String name, Runnable r) {
long start = System.currentTimeMillis();
long conversions = 0;
while (System.currentTimeMillis() - start < 1000) {
int perIter = 10000;
for (int i = 0; i < perIter; ++i) {
r.run();
}
conversions += perIter;
}
long d = System.currentTimeMillis() - start;
long dns = d * 1_000_000;
long nsPerConv = (long) (1.0 * dns / conversions);
long convPerSecond = 1_000_000_000 / nsPerConv;
System.out.println("per " + name + ": " + nsPerConv + "ns; " + convPerSecond + "/s");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment