前提・実現したいこと
MySQL(WordPress)で下記2つの関数にあるSQLどちらがいいのか計測して調べてみようと思いました。
計測はできたのですが、関数をその都度変えたいので、計測する関数 test_rate() の引数に、計測される2つの関数を渡したいです。
発生している問題・エラーメッセージ
test_rate() の引数に、計測される2つの関数を渡す方法がわかりません。(ていうか、できますか?)
該当のソースコード
まず計測される2つの関数は次の通り、test_get_var1() と test_get_var2() です。
PHP
1// 「 $his_id が投稿した thread 」 への comment を取得 (var1) 2function test_get_var1( $his_id ){ 3 global $wpdb; 4 $sql = " 5 SELECT w.thing_id, w.kind_id 6 FROM( 7 SELECT base_t.thing_id 8 ,base_t.kind_id 9 ,parent_t.user_id AS parent_thread_author_id 10 FROM wp_things base_t 11 LEFT JOIN wp_things_comment base_tc 12 ON base_tc.comment_id=base_t.thing_id 13 LEFT JOIN wp_things parent_t 14 ON parent_t.thing_id=base_tc.parent_thread_id AND parent_t.kind_id=2 15 ) AS w 16 WHERE w.kind_id=3 AND w.parent_thread_author_id=$his_id 17 "; 18 $rows = $wpdb->get_results( $sql, ARRAY_A ); 19 return $rows; 20} 21 22// 「 $his_id が投稿した thread 」 への comment を取得 (var2) 23function test_get_var2( $his_id ){ 24 global $wpdb; 25 $sql = " 26 SELECT base_t.thing_id 27 FROM wp_things base_t 28 LEFT JOIN wp_things_comment base_tc 29 ON base_tc.comment_id=base_t.thing_id 30 WHERE base_tc.parent_thread_id IN ( 31 SELECT parent_t.thing_id 32 FROM wp_things parent_t 33 WHERE parent_t.user_id=$his_id AND parent_t.kind_id=2 34 ) 35 "; 36 $rows = $wpdb->get_results( $sql, ARRAY_A ); 37 return $rows; 38} 39
そして計測する関数は次の通り test_rate() で、以下の場合は test_get_var1() しか計測できません。
php
1function test_rate( $lim ){ 2 $arr = []; 3 for ($i = 0; $i < $lim; $i++){ 4 $time_start = microtime(true); 5 $func = test_get_var1(1); 6 $time = microtime(true) - $time_start; 7 $arr[] = $time; 8 } 9 10 // 平均 11 $sum = array_sum($arr); 12 $average = $sum/count($arr); 13 return $average; 14}
このように、上記の test_rate() はその関数内に test_get_var1() があるので test_get_var2() を計測するためにはこの部分を書き換えないといけません。
なので test_rate() の引数に、test_get_var1() や test_get_var2() を渡すことができればいいと考えたのですが、何かそのような方法はありますか?
試したこと
「関数 引数」で調べるとコールバック関数というのを見つけて近いのかなと思い、test_rate() で次のように文字列で関数を渡してみたのですが、実現することができませんでした。
php
1// 計測結果を出力するために、計測される関数を文字列で渡す 2echo json_encode( test_rate( 100, "test_get_var1($his_id)" ) ); 3 4// 計測を実行 5function test_rate( $lim, $func_str ){ 6 $arr = []; 7 for ($i = 0; $i < $lim; $i++){ 8 $time_start = microtime(true); 9 func_go($func_str); 10 $time = microtime(true) - $time_start; 11 $arr[] = $time; 12 } 13 14 // 平均 15 $sum = array_sum($arr); 16 $average = $sum/count($arr); 17 return $average; 18} 19 20// 文字列で渡した関数を実行 21function func_go($func_str){ 22 return $func_str(); 23} 24
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/15 07:13
2020/05/15 07:13
2020/05/15 07:15
2020/05/15 07:39
2020/05/15 07:41
2020/05/15 08:23
2020/05/15 08:50 編集
2020/05/15 08:34
2020/05/15 08:44
2020/05/15 09:01
2020/05/15 09:05
2020/05/15 11:04
2020/05/15 11:13
2020/05/15 11:34
2020/05/15 12:08
2020/05/15 12:18
2020/05/15 12:22