忍者ブログ
適当に調べたことを適当に書きます。
[1] [2]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


<?php
class a {
public function __construct() {
//局所変数はメソッドが終わったらメモリが解放される
$var = str_repeat("1234567890", 1024);
//メンバ変数に10KBセット
$this->var1 = str_repeat("1234567890", 1024);
//メンバ変数に10KBセット
$this->var2 = str_repeat("1234567890", 1024);

//2行目(30KB+αが増えている)
echo memory_get_usage() . "\n";

//$this->var2の値を$this->var3に参照渡し
$this->var3 =& $this->var2;
//3行目(リファレンス渡しの為メモリ使用量が少ない)
echo memory_get_usage() . "\n";

//$this->var2の値を$this->var4にコピー
$this->var4 = $this->var2;
//4行目(コピーの場合はメモリが10KB増える)
echo memory_get_usage() . "\n";
}

public function set() {
$this->var1 .= str_repeat("1234567890", 1024);
}

public function sub() {
$this->var1 = str_repeat("1234567890", 1024);
}
}

//1行目 (メモリの初期値)
echo memory_get_usage() . "\n";

//5行目 (局所変数分のメモリが解放されている)
$a = new a;
echo memory_get_usage() . "\n";

//6行目 (増やした分だけ増える)
$a->set();
echo memory_get_usage() . "\n";

//7行目(減った分だけ解放する)
$a->sub();
echo memory_get_usage() . "\n";

//8行目($this->var1のメモリが解放される)
unset($a->var1);
echo memory_get_usage() . "\n";

//9行目(var3があるためメモリは解放されない)
unset($a->var2);
echo memory_get_usage() . "\n";

//10行目(参照元がなくなった為メモリが解放される)
unset($a->var3);
echo memory_get_usage() . "\n";


出力結果:

60216
91776
91840
102144
91472
101736
91496
81240
81240
70984
PR
最近ではmemcachedなどが持て囃されているが、共有メモリもなかなか扱いやすい。
memcachedと違うところはIDにstringではなくintが必要なところでしょうか。
また、cache_limitのような設定もない。

今回は共有メモリ関数、shmopを使って簡単なカウンターを作ってみた。

カウンタープログラム
カウンタークラス
カウンタークラス(ファイル版)

簡単にファイル版も作成して比べたところでは倍ほど早くなるようだ。
思ったよりは遅かった。

#当然メモリなのでどこかでファイル保存させる処理が必要になる。

tmpデータやsessionデータなど、上手く使えば高速で簡単な処理が可能になりそう?

ちなみにこのshmop系はデフォルトでは使えない。
コンフィギュアオプションを設定する必要がある。(PHP5.2.x)
http://module.jp/blog/cgi_php_servlet_modeprl_benchmark.html
http://memo.blogdns.net/abench.html
http://ryuichi.jp/computer_memo/etc/template_time_match/
http://homepage3.nifty.com/hippo2000/perltips/phpperl.htm
http://homepage3.nifty.com/hippo2000/perltips/javaperl.htm

いろんな場面でPHPかperlかJAVAかRubyか・・・・なんて疑問が沸いてきますよね。
うちの会社にはPHP perl ApacheModule C の4タイプでしょうか。
どれにも一長一短があるように思えます。

例えばPHPは取り扱いが容易です。
また、必要になりそうな機能の多くがネイティブ関数で用意されているのが魅力の一つです。

PerlもCPANを利用するなどで簡素に書くことが出来ますが、汎用的なものを多く使うほど重くなってしまうように思えます。(個人的に)

ApacheModuleは超高速ではありますが、拡張性がPHPやPerlに比べれば格段に落ちます。
Cも同じですね。

私は普段PHPを主に使っていますし、Perlはここ数年書いてもいません。
ちょっとmod_perl2で書いてみたいなーと思ってはいるのですが、ブランクがアレで。
次回のプロジェクトは久しぶりにperlで書いてみようかな。

そんな訳で、用途に合わせて使い分けるのが一番いいかなと思います。

まあ、どちらかに精通することが大切なのかも知れませんね。
更に突き詰めればCだとかアセンブラだとか、キリがないですし。
そんな話をしていると、FileSystemを作ろうとか、CPUを数百個並列に・・・なんて話になっていきます。
PHPの連想配列は、順序リストを持つと言う特性があります。
ハッシュデータは順序について意識しないという言語が多いと思いますので、結構珍しいのです。

%a = ('A'=>1.'B'=>2);         //順番はわからない(perl)
$a  = array('A'=>1,'B'=>2);//左から順番に

なので、each関数などを使うと順序どおりに出てきます。
個人的にこの法則を使ったことはないですが、処理的にはライトウェイトになりそうな予感です。

こんなのを書いてみた。
------------------------------------------------------
var startDD = function(targetObj) {
 DDFunctions.start(targetObj);
};

DragAndDropClass = function() {};

DragAndDropClass.prototype = {
 targetObj : null,

 start  : function(targetObj) {
  if (!targetObj) {
   return;
  }

  var w = StyleFunctions.setWidth(targetObj);

  //ターゲットをbody直下に変更
  var tmpObj = document.createElement(targetObj.tagName);
  tmpObj = targetObj;
  tmpObj.id = Math.floor(Math.random() * 9999999999);
  document.body.appendChild(tmpObj);

  //元のオブジェクトは削除
  delete targetObj;

  this.targetObj = document.getElementById(tmpObj.id);
  this.targetObj.style.width = w;

  StyleFunctions.setAlpha(40, this.targetObj);
  //IEのselectを非表示にする
  StyleFunctions.hiddenSelect('hidden');

  if(window.attachEvent){
   document.onmousemove = this.drag;
   document.onmouseup  = this.drop;
  } else {
   document.addEventListener("mousemove", this.drag,  false);
   document.addEventListener("mouseup",   this.drop,  false);
  }
 },

 drag  : function(e) {
  e = e || window.event;
  if(DDFunctions.targetObj){
   DDFunctions.targetObj.style.position = "absolute";
   DDFunctions.targetObj.style.left  = e.clientX + MouseFunctions.getX(DDFunctions.targetObj) + "px";
   DDFunctions.targetObj.style.top  = e.clientY + MouseFunctions.getY(DDFunctions.targetObj) + "px";
  } else {
   DDFunctions.drop();
  }
 },

 drop  : function() {
  StyleFunctions.setAlpha(100, DDFunctions.targetObj);
  DDFunctions.targetObj = null;
  StyleFunctions.hiddenSelect('visible');

  //重いから消す
  if(window.attachEvent){
   document.onmousemove = null;
   document.onmouseup  = null;
  } else {
   document.removeEventListener("mousemove", DDFunctions.drag,  false);
   document.removeEventListener("mouseup",   DDFunctions.drop,  false);
  }
 }
};


var MouseClass = function(){};

MouseClass.prototype = {
 getX  : function(obj) {
  //親と子がどちらも動く場合。でもちょっとおかしいか。
  var x = obj.parentNode.style.left;
  //pxなどの単位を消す。
  x = (x) ? x.replace(/[^0-9]/,'') : 0;
  x= MouseFunctions.getScrollX() - parseInt(x);
  return x;
 },

 getY  : function(obj) {
  //親と子がどちらも動く場合。でもちょっとおかしいか。
  var y = obj.parentNode.style.top;
  //pxなどの単位を消す。
  y = (y) ? y.replace(/[^0-9]/,'') : 0;
  return MouseFunctions.getScrollY() - parseInt(y);
 },

 getScrollX  : function(){
  var x;
  try{
   x = document.body.scrollLeft || document.documentElement.scrollLeft;
  }catch(e) {
   x = self.pageXOffset;
  }
  return x;
 },

 getScrollY  : function(){
  var y;
  try{
   y = document.body.scrollTop || document.documentElement.scrollTop;
  } catch(e) {
   y = self.pageYOffset;
  }
  return y;
 }
};

var StyleClass = function(){};

StyleClass.prototype = {
 setWidth : function(targetObj) {
  var width = '';
  //IE
  if (targetObj.currentStyle) {
   width = targetObj.currentStyle['width'];
  //FF
  } else if(document.defaultView) {
   width = document.defaultView.getComputedStyle(targetObj, '').getPropertyValue('width');
  //最上位
  } else {
   return 'auto';
  }

  //widthが設定されていなければ再帰
  if ((!width || width == 'auto')) {
   return this.setWidth(targetObj.parentNode);
  }
  return width;
 },
 hiddenSelect : function(value) {
  return;
  is_ie = 0;
  ie_version = 7;
  //IE6以下はSELECTタグがおかしいからこれが必要になりそう
  if (is_ie && ie_version < 7){
   var selectLists = document.getElementsByTagName('select');
   var selectLen   = selectLists.length;
   for (var i = 0; i < selectLen; i++) {
       selectLists[i].style.visibility = value;
   }
  }
 },

 setAlpha  : function(n, obj) {
  try {
   obj.style.filter    = 'alpha(opacity=' + n + ')';
   obj.targetObj.style.MozOpacity = n / 100;
   obj.targetObj.style.opacity  = n / 100;
  } catch(e){}
 }
};


var DDFunctions = new DragAndDropClass();
var MouseFunctions = new MouseClass();
var StyleFunctions = new StyleClass();
------------------------------------------------------

うーん。あまりよろしくない。
Javascriptのオブジェクトをもっと勉強しようと思った。

上のを<script src=""></script>で読んで動かしたいタグに onmousedown="startDD (this)"と書けば動く。
うーん。



忍者ブログ [PR]
カレンダー
06 2025/07 08
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
フリーエリア
最新コメント
最新トラックバック
プロフィール
性別:
非公開
バーコード
ブログ内検索