-
-
Save stepancheg/0ef5ba9f347ffda1e88f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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