データストアのパフォーマンス測定メモ

最終更新日 : 2011/1/9 (2011/1/3 より執筆開始)
下滝 亜里 <asatohan at gmail.com>
内容に関するコメント(感想、提案、書き間違いの指摘)は歓迎します。

このエントリーをはてなブックマークに追加



はじめに

Google App Engine のデータストアにおける割り当て一つである「CPU 時間」の API CPU 時間(API 呼び出し)についての測定結果を紹介します。

測定は、Javaでの低レベル APIを用いて行います。

測定結果

まとめ

注意:測定時点での結果であり、結果が変わる可能性があります。
cycles seconds 補足
put - 作成対象が存在しない場合 580.048
put - 作成対象が存在せずプロパティが1つの場合 78 0.06558 + 20 = 78
put - 作成対象が存在せずプロパティが2つの場合 98 0.08158 + (20 * 2) = 98
put - 作成対象が存在せずプロパティが3つの場合 118 0.09858 + (20 * 3) = 118
put - 作成対象が存在せずプロパティが10個の場合 2580.21558 + (20 * 10) = 258
put - 作成対象が存在せず要素1つのListプロパティが1つの場合 78 0.065
put - 作成対象が存在せず要素2つのListプロパティが1つの場合 98 0.081
put - 作成対象が存在せず要素3つのListプロパティが1つの場合 118 0.098
put - 作成対象が存在せず要素2つのListプロパティが5つの場合 2580.215
put - 作成対象が存在せず2エンティティをバッチ作成 1160.09658 * 2 = 116
put - 作成対象が存在せず3エンティティをバッチ作成 1740.14558 * 3 = 174
get - 取得対象が存在する場合 100.008
get - 取得対象が存在しプロパティが1つの場合 100.008
get - 取得対象が存在しプロパティが2つの場合 100.008
get - 取得対象が存在しプロパティが3つの場合 100.008
get - 取得対象が存在しプロパティが10個の場合 100.008
get - 取得対象が存在し要素2つのListプロパティが5つの場合 100.008
get - 取得対象が存在しない場合 10 0.008
update - 更新対象が存在する場合 480.040
update - 更新対象が存在し1つのプロパティを持ちその値が変化している 880.07348 + 40 = 88
update - 更新対象が存在し1つのプロパティを持ちその値が変化していない 480.04
update - 更新対象が存在し2つのプロパティを持ちそれらの値が変化している 128 0.10648 + (40 * 2) = 128
update - 更新対象が存在し2つのプロパティを持ち1つの値が変化している 88 0.07348 + 40 = 88
update - 更新対象が存在し1つのプロパティを持ち1つのプロパティを追加 68 0.05648 + 20 = 68
delete - 削除対象が存在する場合 250.020
delete - 削除対象が存在し2エンティティをバッチ削除 500.04125 * 2 = 50
delete - 削除対象が存在し3エンティティをバッチ削除 75 0.062525 * 3 = 75
delete - 削除対象が存在しない場合 15 0.012
query - エンティティが存在しない 15 0.012
query - エンティティが1つ存在 260.02115 + (11 * 1) = 26
query - エンティティが2つ存在 37 0.03015 + (11 * 2) = 37
query - エンティティが3つ存在 48 0.0415 + (11 * 3) = 48

何もしない場合

public class Test1Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		// 何もしない

		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);

		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
}
出力:
start: 0 end: 0 seconds: 0.0

put

作成対象が存在しない場合。
public class Test2Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Entity e = new Entity("MyEntity","my");

		ds.put(e);
	}
}
実行前データストアの状態:

出力:

start: 0 end: 58 seconds: 0.04833333333333333

get

取得対象が存在する場合。
public class Test3Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "my");
		
		try {
			ds.get(key);
		
		} catch (EntityNotFoundException e) {
		}
	}
}
実行前データストアの状態:

出力:

start: 0 end: 10 seconds: 0.008333333333333333

update

更新対象が存在する場合。
public class Test4Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		Entity e = new Entity("MyEntity","my");
		ds.put(e);
	}
}

実行前データストアの状態:

出力:

start: 0 end: 48 seconds: 0.04

delete

削除対象が存在する場合。
public class Test5Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "my");

		ds.delete(key);
	}
}
実行前データストアの状態:

出力:

start: 0 end: 25 seconds: 0.020833333333333332

get - 取得対象が存在しない場合

public class Test7Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "my");
		
		try {
			ds.get(key);
		
		} catch (EntityNotFoundException e) {
		}
	}
}
実行前データストアの状態:

出力:

start: 0 end: 10 seconds: 0.008333333333333333

delete - 削除対象が存在しない場合

削除対象が存在しない場合。
public class Test6Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "my");

		ds.delete(key);
	}
}
実行前データストアの状態:

出力:

start: 0 end: 15 seconds: 0.0125

put - 作成対象存在せずプロパティが1つ

作成対象が存在せず、プロパティを1つ持つ場合。
public class Test8Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		Entity e = new Entity("MyEntity","my");
		e.setProperty("property1", "aaa");
		ds.put(e);
	}
}
実行前データストアの状態:

出力:

start: 0 end: 78 seconds: 0.065

put - 作成対象が存在せずプロパティが2つ

作成対象が存在せず、プロパティを2つ持つ場合。
public class Test9Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Entity e = new Entity("MyEntity","my");
		e.setProperty("property1", "aaa");
		e.setProperty("property2", 111);

		ds.put(e);
	}
}
実行前データストアの状態:

出力:

start: 0 end: 98 seconds: 0.08166666666666667

put - 作成対象が存在せずプロパティが3つ

作成対象が存在せず、プロパティを3つ持つ場合。
public class Test10Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
	
		Entity e = new Entity("MyEntity","my");
		e.setProperty("property1", "aaa");
		e.setProperty("property2", 111);
		e.setProperty("property3", KeyFactory.createKey("MyEntity", "your"));
		
		ds.put(e);
	}
}
実行前データストアの状態:

出力:

start: 0 end: 118 seconds: 0.09833333333333333

get - 取得対象が存在しプロパティが1つ

取得対象が存在し、プロパティを1つ持つ場合。
public class Test11Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "my");
		
		try {
			ds.get(key);
		
		} catch (EntityNotFoundException e) {
		}
	}
}
実行前データストアの状態:

出力:

start: 0 end: 10 seconds: 0.008333333333333333

get - 取得対象が存在しプロパティが2つ

取得対象が存在し、プロパティを2つ持つ場合。
public class Test12Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "my");
		
		try {
			ds.get(key);
		
		} catch (EntityNotFoundException e) {
		}
	}
}
実行前データストアの状態:

出力:

start: 0 end: 10 seconds: 0.008333333333333333

get - 取得対象が存在しプロパティが3つ

取得対象が存在し、プロパティを3つ持つ場合。
public class Test13Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "my");
		
		try {
			ds.get(key);
		
		} catch (EntityNotFoundException e) {
		}
	}
}
実行前データストアの状態:

出力:

start: 0 end: 10 seconds: 0.008333333333333333

put - 作成対象が存在せずプロパティが10個

作成対象が存在せず、プロパティを10個持つ場合。
public class Test14Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Entity e = new Entity("MyEntity","my");

		for(int i = 0; i < 10; i++) {
			e.setProperty("property" + i, i);
		}

		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 258 seconds: 0.215

get - 取得対象が存在しプロパティが10個

取得対象が存在し、プロパティを10個持つ場合。
public class Test15Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "my");
		
		try {
			ds.get(key);
		
		} catch (EntityNotFoundException e) {
		}
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 10 seconds: 0.008333333333333333

put - 作成対象が存在せず要素1つのListプロパティが1つ

作成対象が存在せず、要素1つのListプロパティを1個持つ場合。
public class Test16Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Entity e = new Entity("MyEntity","my");

		List l = new ArrayList();
		l.add("aaa");

		e.setProperty("property1", l);
		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 78 seconds: 0.065

put - 作成対象が存在せず要素2つのListプロパティが1つ

作成対象が存在せず、要素2つのListプロパティを1個持つ場合。
public class Test17Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Entity e = new Entity("MyEntity","my");

		List l = new ArrayList();
		l.add("aaa");
		l.add("bbb");

		e.setProperty("property1", l);
		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 98 seconds: 0.08166666666666667

put - 作成対象が存在せず要素3つのListプロパティが1つ

作成対象が存在せず、要素3つのListプロパティを1個持つ場合。
public class Test18Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Entity e = new Entity("MyEntity","my");

		List l = new ArrayList();
		l.add("aaa");
		l.add("bbb");
		l.add("ccc");
		
		e.setProperty("property1", l);
		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 118 seconds: 0.09833333333333333

put - 作成対象が存在せず要素2つのListプロパティが5つ

作成対象が存在せず、要素2つのListプロパティを5個持つ場合。
public class Test19Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Entity e = new Entity("MyEntity","my");

		List l = new ArrayList();
		l.add("aaa");
		l.add("bbb");

		for(int i = 0 ; i < 5; i++) {
			e.setProperty("property" + i, l);		
		}
		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 258 seconds: 0.215

get - 取得対象が存在し要素2つのListプロパティが5つ

取得対象が存在し、要素2つのListプロパティを5個持つ場合。
public class Test20Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Key key = KeyFactory.createKey("MyEntity", "my");
		
		try {
			ds.get(key);
		
		} catch (EntityNotFoundException e) {
		}
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 10 seconds: 0.008333333333333333

put - 作成対象が存在せず2エンティティをバッチ作成

作成対象が存在せず、2つのエンティティをバッチ作成する場合。
public class Test21Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		List list = new ArrayList();
		
		list.add( new Entity("MyEntity","my1") );
		list.add( new Entity("MyEntity","my2") );
		
		ds.put(list);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 116 seconds: 0.09666666666666666

put - 作成対象が存在せず3エンティティをバッチ作成

作成対象が存在せず、3つのエンティティをバッチ作成する場合。
public class Test22Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		List list = new ArrayList();
		
		list.add( new Entity("MyEntity","my1") );
		list.add( new Entity("MyEntity","my2") );
		list.add( new Entity("MyEntity","my3") );
		
		ds.put(list);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 174 seconds: 0.145

delete - 削除対象が存在し2エンティティをバッチ削除

削除対象が存在し、2つのエンティティをバッチ削除する場合。
public class Test23Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		List list = new ArrayList();
		
		list.add( KeyFactory.createKey("MyEntity","my1") );
		list.add( KeyFactory.createKey("MyEntity","my2") );
		
		ds.delete(list);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 50 seconds: 0.041666666666666664

delete - 削除対象が存在し3エンティティをバッチ削除

削除対象が存在し、3つのエンティティをバッチ削除する場合。
public class Test24Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		List list = new ArrayList();
		
		list.add( KeyFactory.createKey("MyEntity","my1") );
		list.add( KeyFactory.createKey("MyEntity","my2") );
		list.add( KeyFactory.createKey("MyEntity","my3") );
		
		ds.delete(list);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 75 seconds: 0.0625

update - 更新対象が存在し1つのプロパティを持ちその値が変化している

更新対象が存在し、1つのプロパティを持ちそのプロパティの値が変化している場合。
public class Test25Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		Entity e = new Entity("MyEntity","my");
		e.setProperty("property1", "AAA");

		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 88 seconds: 0.07333333333333333

update - 更新対象が存在し1つのプロパティを持ちその値が変化していない

更新対象が存在し、1つのプロパティを持ちそのプロパティの値が変化していない場合。
public class Test26Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		Entity e = new Entity("MyEntity","my");
		e.setProperty("property1", "aaa");

		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 48 seconds: 0.04

update - 更新対象が存在し2つのプロパティを持ちそれらの値が変化している

更新対象が存在し、2つのプロパティを持ちそれらプロパティの値が変化している場合。
public class Test27Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		Entity e = new Entity("MyEntity","my");
		e.setProperty("property1", "AAA");
		e.setProperty("property2", "BBB");
		
		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 128 seconds: 0.10666666666666667

update - 更新対象が存在し2つのプロパティを持ち1つの値が変化している

更新対象が存在し、2つのプロパティを持ち、1つのプロパティの値が変化している場合。
public class Test28Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		Entity e = new Entity("MyEntity","my");
		e.setProperty("property1", "aaa");
		e.setProperty("property2", "BBB"); // こちらだけ更新
		
		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 88 seconds: 0.07333333333333333

update - 更新対象が存在し1つのプロパティを持ち1つのプロパティを追加

更新対象が存在し、1つのプロパティを持ち、1つのプロパティを追加する場合。
]
public class Test29Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		Entity e = new Entity("MyEntity","my");
		e.setProperty("property1", "aaa");
		e.setProperty("property2", "bbb"); // 追加
		
		ds.put(e);
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 68 seconds: 0.056666666666666664

query - エンティティが存在しない

エンティティが存在しないKindに対するクエリの場合。
public class Test30Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

		Query q = new Query("MyEntity");
		List l = ds.prepare(q).asList(withLimit(1000));
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 15 seconds: 0.0125

query - エンティティが1つ存在

エンティティが1つ存在するKindに対するクエリの場合。
public class Test31Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		Query q = new Query("MyEntity");
		List l = ds.prepare(q).asList(withLimit(1000));
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 26 seconds: 0.021666666666666667

query - エンティティが2つ存在

エンティティが2つ存在するKindに対するクエリの場合。
public class Test32Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		Query q = new Query("MyEntity");
		List l = ds.prepare(q).asList(withLimit(1000));
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 37 seconds: 0.030833333333333334

query - エンティティが3つ存在

エンティティが3つ存在するKindに対するクエリの場合。
public class Test33Servlet extends HttpServlet {

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
		throws IOException
	{
		QuotaService qs = QuotaServiceFactory.getQuotaService();
		long start = qs.getApiTimeInMegaCycles();

		doAction();
		
		long end   = qs.getApiTimeInMegaCycles();
		double seconds = qs.convertMegacyclesToCpuSeconds(end - start);
		
		resp.getWriter().println("start:   " + start);
		resp.getWriter().println("end:     " + end);
		resp.getWriter().println("seconds: " + seconds);
	}
	
	private void doAction() {
		
		NamespaceManager.set("pf");
		
		DatastoreService ds = DatastoreServiceFactory.getDatastoreService();
		
		Query q = new Query("MyEntity");
		List l = ds.prepare(q).asList(withLimit(1000));
	}
}
実行前のデータストア状態:

測定結果:

start: 0 end: 48 seconds: 0.04

参考文献とリソース

更新履歴

todo/memo