問題タブ [processing-efficiency]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PHP で乱数ジェネレーターを書きましたが、これをどのように改善できると思いますか?
私はクライアントのために働いていて、彼は T56、N78、J89 などのように [char][int][int] の形式で生成されたコードを望んでいました... char は大文字でなければなりません。
急ごしらえとして、私はこの関数を最も単純だと思ったので書きました
しかし、他にも多くの効率的なソリューションがあるのではないかとずっと考えていました。上記はうまくいきますが、そのようなコードを大量に生成する必要があるため、効率を重視しています。
どこから始めるのが良いでしょう!
sql - SQLワイルドカード検索-効率?
LIKE
最近、ワイルドカードを使用してMSSQLデータベースを検索する最も効率的な方法について議論が行われています。%abc%
、、、%abc
を使用して比較していabc%
ます。ある人は、用語の終わりには常にワイルドカードを使用する必要があると言っています(abc%
)。したがって、彼らによると、「abc」で終わるものを見つけたい場合は、 `reverse(column)LIKE reverse('%abc')を使用するのが最も効率的です。
SQL Server 2008(R2)を使用してテストを設定し、次の各ステートメントを比較しました。
CLMASTERは約500,000レコードを保持し、「Street」で終わる約7,400のアドレスと、「Street」が含まれるが必ずしも最後ではない約8,500のアドレスがあります。各テストの実行には2秒かかり%STREET%
、最後にアパート番号が付いている住所を取得したため、900程度の追加の結果が見つかった以外は、すべて同じ量の行が返されました。
SQL Serverテストでは実行時間に違いが見られなかったため、PHPに移行し、次のコードを使用して各ステートメントを切り替え、複数のテストをすばやく実行しました。
このテストの結果は、SQLServerでテストしたときの結果とほぼ同じくらいあいまいでした。
%STREET
166.5823秒(クエリあたり平均.3331)で完了し、.0228で平均500件の結果が見つかりました。
%STREET%
149.4500秒(クエリあたり平均.2989)で完了し、.0177で平均500件の結果が見つかりました。(同様の時間に他の結果よりも多くの結果が見つかるため、結果ごとの時間が短縮されます。)
reverse(ADDRESS) like reverse('%STREET')
134.0115秒(クエリあたり平均.2680)で完了し、.0183秒で平均500件の結果が見つかりました。
reverse('TREETS%')
167.6960秒(クエリあたり平均.3354)で完了し、.0229で平均500件の結果が見つかりました。
このテストで%STREET%
は、全体的に最も遅いことが示されると予想しましたが、実際には実行が最も速く、500件の結果を返すのに最適な平均時間がありました。提案さreverse('%STREET')
れたものは全体的に実行するのが最も速かったが、500の結果を返すのに少し時間がかかった。
さらに楽しい:テストの実行中に同僚がサーバーでプロファイラーを実行したところ、ダブルワイルドカードを使用するとCPU使用率が大幅に増加し、他のテストは互いに1〜2%以内であることがわかりました。
検索文字列の最後にワイルドカードを付ける方が最初よりも優れている理由、および文字列の最初と最後にワイルドカードを使用する方がワイルドカードを使用するよりも高速である理由を説明できるSQL効率の専門家はいますか?初めに?
php - PHP で 1 分あたりのヒット数を効率的に制限する (Web スクレイピングまたはコピーボットをブロックする)
ボットが私のウェブページからすべてのコンテンツをコピーするという問題に直面しています (私はかなり頻繁に更新しようとしています)。
それらを禁止するか、コードを難読化してコピーをより困難にしようとしています。しかし、彼らはこれらの制限を克服する方法を見つけました。
1 分あたりのヒット数 (または X 時間、必ずしも分ではありません) を制限したいと思いますが、キャプチャを使用してこれらの制限を克服します。たとえば、過去 5 分間に 10 ページを超えるページをリクエストした場合は、Captcha を使用して人間であることを証明する必要があります。そのため、ユーザーが正当なユーザーであれば、引き続き Web サーフィンを行うことができます。
コンテンツページでのみ行いたいです(より効率的に行うため)。MemCached も考えたのですが、サーバーに借りがないので使えません。もし私がサーブレットを使っていたら、HashMap などを使うでしょうが、私は PHP を使っているので、まだ解決策を考えようとしています。
1 秒あたりのヒット数が多いため、MySql (またはデータベース) を解決策とは考えていません。そして、数分前のリクエストの後に削除する必要があり、不要で非効率的なトラフィックが大量に発生します。
何か案は?
要約: Web ページのセクションで 1 分あたりのヒット数が多すぎる場合は、PHP で Captcha を効率的に使用して制限したいと考えています。たとえば、過去 5 分間に 10 ページを超えるページをリクエストした場合は、Captcha を使用して人間であることを証明する必要があります。
c++ - 配列の一部を変更する最速の方法
bool 配列の連続要素のブロックに対して not 操作を実行してから、完全な配列を読み返したいと考えています。次のコードを使用して操作を実行しています。
これは問題なく動作しますが、プログラムの速度を上げようとしています。同じ操作を実行するより良い方法はありますか?
ruby - Ruby でのディレクトリ ウォークのひねり
私は次のことをしたいと思います:
ディレクトリ ツリーが与えられた場合:
... ディレクトリ ツリーをたどって、少なくとも 1 つのファイルを含む各ディレクトリの最初のファイルへのパスを含む配列を作成したいと思います。全体的な構造は、ディレクトリよりも多くのファイルで非常に大きくなる可能性があるため、特定のディレクトリ内のすべてのファイルを反復処理せずに、最初のファイルへのパスのみを取得したいと考えています。1ファイルで十分です。上記のツリーの場合、結果は以下のみを含む配列のようになります。
Ruby で Dir オプションと Find オプションを試してみましたが、私のアプローチは力ずくのように感じます。
この機能をコーディングする効率的な方法はありますか? ここでルビーのトリックが欠けているように感じます。
どうもありがとう!
これが私のアプローチです:
動作しますが、乱雑に見えます。
bash - ファイル内の特定のフィールドの単語の文字の間に空白を挿入する方法
このような100000行を含むファイルがあります
文字間に空白を追加して、2番目のフィールドだけを効率的に表示するにはどうすればよいか知りたいです。
1つの解決策は、awkで2番目の列を取得し、sedを使用して空白を追加することです。ただし、ファイルが長すぎるため、パイプの使用は避けたいと思います。それなら、awkを使うだけでそれができるのだろうかと思います。
前もって感謝します
bash - テキスト ファイル内の複数の文字列の効率的な検索
egrepを使用して、非常に長いファイル (100 万行) 内の複数の文字列の正確な一致を探します。
しかし、たった 2 つの文字列を見つけるだけでも時間がかかりすぎます。オカレンスが見つかった場合でも、ファイルの合計行に沿ってすべての文字列を探すようです。実際、ファイルには各文字列が 1 回だけ含まれていることがわかっています。それから、文字列の出現を見つけたら、egrep に文字列の検索を停止させ、リストの次の文字列を探すように強制する方法を知りたいです。または、それを効率的に行う別の方法がある場合。
ありがとう。
c - プッシュと移動のコスト(スタックとニアメモリ)、および関数呼び出しのオーバーヘッド
質問:
スタックへのアクセスはメモリへのアクセスと同じ速度ですか?
たとえば、スタック内でいくつかの作業を行うことを選択したり、メモリ内のラベル付けされた場所で直接作業を行うことができます。
だから、具体的には:とpush ax
同じ速度mov [bx], ax
ですか?同様にpop ax
、速度はmov ax, [bx]
?(bxがnear
メモリ内の場所を保持していると仮定します。)
質問の動機:
Cでは、パラメーターを受け取る自明な関数を思いとどまらせるのが一般的です。
これは、パラメーターがスタックにプッシュされ、関数が戻ったときにスタックからポップされる必要があるだけでなく、関数呼び出し自体がCPUのコンテキストを保持する必要があるため、つまりスタックの使用量が増えるためだといつも思っていました。
しかし、見出しの質問に対する答えを知っていると仮定すると、関数がそれ自体をセットアップするために使用するオーバーヘッド(プッシュ/ポップ/コンテキストの保持など)を、同等の数のダイレクトメモリアクセスの観点から定量化できるはずです。したがって、見出しの質問。
(編集:明確化:上記で使用されているのは、16ビットx86アーキテクチャのセグメント化されたメモリモデル
near
とは対照的です。)far
performance - 並列と直列の効率と高速化
現在、私は教授が授業で配ったガイドを読み返しています。学習ガイドは課題ではなく、試験で何を期待するかを知るためのものです。私は 1 つの問題を除いてすべて完了し、誰かが私を助けてくれることを望んでいました。
ここに問題があります。Tserial = n および Tparallel = n/p + log2(p) とします。ここで、時間はミリ秒単位で、p はプロセス数です。p を k 倍に増やした場合、一定の効率を維持するために n をどれだけ増やす必要があるかを示す式を見つけます。プロセスの数を 8 から 16 に倍増する場合、n をどれだけ増やす必要がありますか? 並列プログラムはスケーラブルですか?
これを理解するための助けをいただければ幸いです。