//tips
嶋津様打ち合わせ。Axie Infinityを教えてもらったので触ってみる。準備中。久しぶりにbybit開いた。
//基本情報理解及びC#
CPUのパイプライン処理とは、命令が実行順に主記憶に並んでいると仮定して、命令を先取りする。この仮定を否定するif,caseや関数呼び出しが多くなればパイプライン処理の効率が悪化する。
CPUの処理は4つの段階を踏み、
命令の読み込み(フェッチ)
解釈(デコード)
実行(エグゼキュート)
結果の書き込み(ライトバック)
となるが、通常は、前の命令のサイクルが完全に終わらないと次のタスクに進む事ができない。
これに対し、パイプライン機構を備えたプロセッサは各段階のユニットを独立に制御でき、前の命令がデコードに移ったら次の命令をフェッチするといった動作が可能になる。
タスク1のデコードとタスク2のフェッチを平行処理できるようになる。
これにより一命令あたりの実行時間を大幅に短縮することができる。
https://isabou.net/Convenience/Tool/gpu/gpu12.asp
https://ascii.jp/elem/000/000/552/552029/
投機実行は、分岐判断の結果が出る前に分岐先を予測して命令を先行実行していく方式で、予測の精度が高ければ処理継続ができるので性能向上が期待できる。
メモリインタリーブは、物理上は1つである主記憶領域を、論理的な複数の領域に分け、これに並列アクセスすることで見かけ上のアクセス時間の短縮を図るメモリアクセス高速化の手法です。
メモリを分身させて働かせているが実は一つのメモリ。
CPUがメモリへアクセス要求を行ってから実際にデータが送られてくるまでにはレイテンシ(latency:遅延)と呼ばれる時間差が生じるのでこれをなるべく早くしようということ。
SoC(System on a Chip)とは、システムの動作に必要な機能を一つのチップに搭載した集積回路。
CPUはそれだけではスマホやタブレットのすべてを制御できないので、SoCではCPUも含めて制御に必要な複数の部品が1つのチップにまとめられている。
ゲームなどの描画処理を実行するためにはGPUが必要で、その他にも4Gや3Gのモバイルデータ通信を処理するベースバンド、ディスプレイやカメラ、GPSなどを搭載するためのインターフェイスなどもCPUとは別に用意する必要がある。
Hzとmsの違いについて。
Hzは、リフレッシュレートといって1秒間に何枚画像を映し出すことができるかというもので、パラパラ漫画の構造に近い。1秒間に10枚めくるときと60枚めくるときでは、滑らかに動いて見えるかは60枚の方。
msとは時間の単位、ミリ秒(1000分の1秒)のことでモニターの場合は応答速度の意味で使われる。
応答速度とは、モニターのドットの色が変わるまでの時間を表したもの。応答速度が遅い(数値が大きい)と画面表示速度やコントローラーなどの入力時に遅延を感じたり動きの激しいスポーツ動画や一人称視点シューティングゲームなどの視点移動の際に残像感が残る。
数値が小さければ小さいほど応答速度が早い。
Hzからmsへの1周期の時間に換算する場合、周波数の値をf(Hz)、1周期の時間t(ms)とすると、次のようになる。
t=1000/f
https://monoist.atmarkit.co.jp/mn/articles/0611/28/news110.html
//C#
Return文にはメソッドの実行を中断させ、呼び出し側に制御を戻す機能があるので、条件を満たさないケースをreturn分を使って、先頭で取り除いてコードを読みやすくする。
if(filePath==null)
return;
if(fGetOption()==Option.Skip)
return;
などふるいにかけていくやり方が推奨されているので覚えておく。
if(filePath!=null)
{
if(fGetOption()!=Option.Skip)
{
…
}
}
の形でいつも書いていたので反省。文が複雑になり見やすさが損なわれるよう。
if(a==b)
return true
としなくても、a==bはboolの値を持っているので
return a==b;
として問題ない。
ループ内でreturnを使用する場合はメソッドが単機能になっていることを確認してから行う。本来やるべきことをやらずにメソッドから抜けてしまうとバグの要因になる。
条件を判断し、真偽で異なる値を変数に代入したい時には積極的に三項演算子を使用する。
var num = list.Contain(key)?1:0;
Nullかどうかを判断し、条件を分岐させたいケースはnull合体演算子??を使用する。
var message =GetMessage(code)??DefaultMessage();
これは
var message =GetMessage(code);
if(message==null)
message=DefaultMessage();
と同じ。
GetMessageメソッドはnullを返すこともあるのでその場合はDefaultMessageメソッドの値を設定している。
Null条件演算子?.を使用することで
if(sale==null)
return null;
else
return sale.Product
はreturn sale?.Product;の一文でかける。
またプロパティがpublicでなぜ大丈夫だったのか分からなくなったので下記のものを復元した。
using System;
public class PropertyCls { //プロパティを記述するクラス
public int PropertyInt{ set; get;}
}
class Program { //プロパティを利用するクラス
static void Main() {
PropertyCls p = new PropertyCls(); //インスタンスを生成
p.PropertyInt = 32; //値を代入(setを呼ぶ)
Console.WriteLine(p.PropertyInt); //値を取得(getを呼ぶ)
}
}
これの復元が下記となり、きちんとメンバ変数のprivate int propertyInt;が隠されている(省略されている)事がわかる。
public class PropertyCls { //プロパティを記述するクラス
// メンバ変数は外部から隠蔽(privateに)しておき、直接アクセスできないようにする
private int propertyInt;
// 変数の取得・変更用のプロパティ
public int PropertyInt
{
set{ propertyInt = value; } //値の代入
get { return propertyInt; } //外部に値を返す
}
}
class Program { //プロパティを利用するクラス
static void Main() {
PropertyCls p = new PropertyCls(); //インスタンスを生成
p.PropertyInt = 32; //値を代入(setを呼ぶ)
Console.WriteLine(p.PropertyInt); //値を取得(getを呼ぶ)
}
}