hasItemスピードテスト(コマンド VS ScriptAPI)

スポンサーリンク

注意

・このテスト方法がどれほど有効であるかは各自の判断にお任せします
・実行環境はウィンドウズ11にupdateできない程古いPCのため、十分に高いスペックの端末であれば差が縮まる可能性はあります

検証1

後述の「ダイヤ所持を検出する」処理速度検証用Scriptを、ダイヤ有り無しそれぞれで実行
ダイヤ以外は乱雑なアイテムで埋まっている

結果

Scriptの圧勝
▼ダイヤ持ってない状態で実行
結果1回目: command : 11787 / script 99
結果2回目: command : 11293 / script 76
結果3回目: command : 11243 / script 76
結果4回目: command : 11167 / script 67

▼インベントリ左上にダイヤ
結果1回目: command : 16323 / script 68
//持っている側では明らかにrunが足かせになった
//再検証する方はもっと軽いコマンドに変更したり、Script側にも同等の処理を付けることをおすすめします

検証内容2

同検証用Scriptの
「execute if entity @s[hasitem={item=minecraft:diamond}] run say 1」を
「tag @s[hasitem={item=minecraft:diamond}] add have_diamond」に置き換えることで軽量化できるか
※この方法だと最初の一回しかタグをつけれないので、本来であればタグを削除する処理が必要なため、検証としてはチートといえる

結果

結果1回目: command : 11258 / script 69

解散!

以下、検証用Scriptコード

world.beforeEvents.chatSend.subscribe( async(ev) => {
if(ev.message === "!hasItemSpeedTest"){
system.runJob( testSpead(ev) );
}
});

function* testSpead(ev){
let command_time=0;
let script_time =0;
// それぞれ100*1000回実行for( let i =0; 1000> i;i++ ){
command_time = command_time + testHasItemCommand(ev.sender);
script_time = script_time + testHasItemScript(ev.sender);
yield;
}
world.sendMessage("command : "+ command_time + " / script : "+ script_time);
}
// command処理時間取得functiontestHasItemCommand(player){
const start_time = Date.now();
for(let i=0; 100 > i; i++){
player.runCommand("execute if entity @s[hasitem={item=minecraft:diamond}] run say 1")
}
const end_time = Date.now();
return end_time - start_time;
}
// Script処理時間取得functiontestHasItemScript(player){
const start_time = Date.now();
const container = player.getComponent("inventory").container;
for(let i=0; 100 > i; i++){
for(let j=0; container.inventorySize > j;j++){
if(container.getItem(j).typeId == "minecraft:diamond"){
break;
}
}
}
const end_time = Date.now();
return end_time - start_time;

※なお他にもアドオン多数入ってるし、環境によって変動する可能性も十分にあります……
 気になった方は各自検証の上、結果をコメントで教えてくださいな

※投稿記事に含まれるファイルやリンクにより発生した被害についてクラフターズコロニーは責任を取りません
投稿通報

コメント

  1. hasitemとscriptAPIもそうですが、player.jsonのenvironment_sensorもまた違うタイミングでイベントを発生させている気がします

コメント通報