私は Prevayler と協力して、非常に簡単なストレス テストを行っています。
私のプログラムでは、500 ミリ秒で 10,000 回の読み取りを取得できますが、1 つのオブジェクトの書き込みまたは変更には 23 ミリ秒かかります。(このコンピューターの詳細な仕様はありません。印象的なものはありません。デュアルコア 3.0GHz、7200rpm HD、およびおそらく 1333MHz ddr3 メモリです。)
シリアル化がボトルネックのようです。
書き込み/変更のパフォーマンスを向上させるために何ができますか?
JProfiler JProfiler でプログラムを実行しました (10,000 個のユーザー オブジェクトがディスクに書き込まれました)。250 秒間実行され、その時間の 99.6% が org.implementation.PrevaylerImpl.execute の実行に使用されました。
更新 XStreamSerializer に切り替えました。これにより、書き込み速度が書き込みあたり 21 ミリ秒に向上し、ストレージが
3555KB ジャーナル/10,000 オブジェクト -> 2421KB
350KB スナップショット/10,000 オブジェクト -> 313KB
1 秒あたり 1000 回以上の書き込みを見たいです。
---- Main Method ----
Transactor trans = new Transactor();
for(int i =0;i<10000;i++)
{
trans.createUser("Username", "PasswordHash");
}
---- Transactor Class ----
public void createUser(String Username, String PasswordHash) {
String id = Helper.randomID();
//Avoids id duplicates, id is 7 digit base58. (Like Bitcoin, but shorter.)
//ID generation takes .0078ms.
while(getUser(id)!=null)
{
id=Helper.randomID();
}
prevayler.execute(new CreateUser(Username, PasswordHash,id));
}
---- CreateUser Class ----
public class CreateUser implements Transaction, Serializable{
String Username;
String PasswordHash;
String id;
public CreateUser(String Username, String PasswordHash, String id)
{
this.Username = Username;
this.PasswordHash = PasswordHash;
this.id = id;
}
public void executeOn(Object core,Date date) {
((Core)core).store(new User(Username, PasswordHash), id);
}
}
---- Core Class (Store method) ----
private final Map<String,Object> dataMap = new HashMap<String,Object>();
public void store(Object object, String id) {
dataMap.put(id, object);
//Adds User id to a seperate ArrayList<String>
if(object instanceof User )
{
userList.add(id);
}
}