Minecraftとタートルと僕

PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。

こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。

「百億のマインクラフトと千億のタートル」(https://hevo2.hatenablog.com/)

「Too long without yielding」エラー発生までの時間を検証

発端

ご飯食べながらボーっとCC公式Wiki読んでいたら次のような記述をみつけました。
http://computercraft.info/wiki/OS_(API)

  • os.pullEvent()の説明にて

Note that if a program has not attempted to pull an event in the past ten seconds, it will be forcefully terminated to prevent CPU waste in SMP environments.

え?10秒? これってまさか「Too long without yielding」エラーのこと言っている?
この記述だけだとよくわからないし、
自分でも正確に時間をはからず大体の時間で5秒なんて言っていたので、
エラー発生までの時間を正確に計ってみることにしました。

検証

プログラム

使ったプログラムは次のとおり。

local stime = os.clock()
while true do
  print(os.clock() - stime)
end
  • プログラム起動時の経過時間を保存しておいて、あとは現在経過時間との差をひたすら画面表示するプログラム。
    • os.clock()はそのコンピュータ(タートル)が起動してからの経過時間(秒)を表示
    • os.clock()はcoroutine.yield()を含んでいないので順調に(?)エラーが発生します。

結果

念のため新規にワールドを作って(非クリエイティブ)、NEIチートでタートルを出して検証。

f:id:hevohevo:20140115222751p:plain

  • 「Too long without yielding」エラー発生までの時間は5秒で間違いないようです。

公式Wikiの10秒ってこれ何のこと言っているのさ!!