質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1096閲覧

コードを実行時、CPUの待機時間を減らす方法

yuki_90453

総合スコア326

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

0クリップ

投稿2016/11/09 02:07

編集2016/11/10 03:08

###前提・実現したいこと
自分で定義した一部のメソッドのみ待機時間が異常に長く困っています。
benchmarkで計測した結果、Real項目が平均20秒近く掛かっている事がわかりました。
ネットで調べた結果、realの部分は「CPU がぼーっとしていたり,他の仕事をやっている時間も含まれる。」と書かれておりましたが、他のアプリケーションを閉じていても結果は変わりませんでした。

下記に2つのメソッドベンチマークの結果を掲載しておりますが、「条件分岐」と名前が付いている方が、問題のあるメソッドです。

このreal項目が異常に長いのがわかると思いますが、どうすれば改善出来ますでしょうか?

宜しくお願い致します。

###該当のソースコード

ruby

1def point(i) 2 if element_present?(i, :xpath, ".//th[contains(text(),'ポイント利用(')]") == true 3 point_nextTD(i) 4 else 5 return " " 6 end 7 end 8 9 def element_present?(where, how, what) 10 Benchmark.bm 10 do |r| 11 r.report "条件分岐" do 12 begin 13 where.find_element(how => what) 14 true 15 rescue Selenium::WebDriver::Error::NoSuchElementError 16 false 17 end 18 end 19 end 20 end 21 22 def point_nextTD(i) 23 Benchmark.bm 10 do |r| 24 r.report "アクション" do 25 i.find_element(:xpath => ".//th[contains(text(),'ポイント利用(')]/following-sibling::td").text().gsub(/[円]/,"").gsub(/[,]/,"").to_i 26 end 27 end 28 end

###ベンチマークの結果

ruby

1user system total real 2条件分岐 0.040000 0.020000 0.060000 ( 26.678073) 3 user system total real 4条件分岐 0.050000 0.030000 0.080000 ( 25.499489) 5 user system total real 6条件分岐 0.010000 0.000000 0.010000 ( 0.017920) 7 user system total real 8条件分岐 0.050000 0.030000 0.080000 ( 24.706779) 9 user system total real 10条件分岐 0.000000 0.000000 0.000000 ( 0.011791) 11 user system total real 12条件分岐 0.000000 0.000000 0.000000 ( 0.012549) 13 user system total real 14条件分岐 0.050000 0.020000 0.070000 ( 25.037440) 15 user system total real 16条件分岐 0.050000 0.020000 0.070000 ( 26.076752) 17 user system total real 18条件分岐 0.000000 0.000000 0.000000 ( 0.018694) 19 user system total real 20アクション 0.000000 0.000000 0.000000 ( 0.038412) 21 user system total real 22アクション 0.010000 0.000000 0.010000 ( 0.028833) 23 user system total real 24アクション 0.010000 0.000000 0.010000 ( 0.032794) 25 user system total real 26アクション 0.000000 0.000000 0.000000 ( 0.026723) 27 user system total real 28アクション 0.000000 0.000000 0.000000 ( 0.030527)
maisumakun👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

当方、自分ではBenchmarkもrescueもtimeoutも使ったことがないです。
見当違いだったらすみません。

rescue Selenium::WebDriver::Error::NoSuchElementError

rescue Selenium::WebDriver::Error::NoSuchElementError =>e
と『 =>e』を付けると、eにエラー内容が記述される……らしいです。
falseの前に『p e』とか付ければ何かわかる、かも?

また、根本的な解決になるかは分かりませんが、
Timeout関数という物があるらしいです。
rescue Timeout::Error とかrescueにも記述できるみたいですね。
タイムアウトで良いのか、(そもそも使い方が合っているのか?)という問題もありますが
timeout(秒数)で囲って見る手もあるかもしれません。

投稿2016/11/10 04:40

torisan

総合スコア678

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問