0

どのフォームが最も効率的ですか?

1)

v=''
v+='a'
v+='b'
v+='c'

2)

v2='a'` `'b'` `'c'

読みやすさがあなたにとってまったく同じであると仮定すると、それはストレッチです.1)いくつかの文字列不変(Pythonのように)を作成して破棄するか、バッファ容量を定期的に拡張するJava「StringBuffer」として機能しますか?文字列連結はBashで内部的にどのように処理されますか?

2) が 1) と同じくらい読みやすい場合、バックティックはサブシェルを生成し、1) で行われることよりも潜在的な「操作なし」であっても、よりコストがかかりますか?

4

2 に答える 2

2

さて、最も単純で最も効率的なメカニズムはオプション0です:

v="abc"

最初のメカニズムには、4つの割り当てが含まれます。

2番目のメカニズムは奇妙です(そして間違いなく読めません)。これは(名目上)2つのサブシェル(2つの` `部分)で空のコマンドを実行し、出力(空の文字列)を3つの定数と連結します。シェルが空であることに気付かずに単にバックティックコマンドを実行する場合(そして、気付かないのは不合理ではありません。試してみるのは奇妙なことです。過去30年間に実行されたのを覚えていません。シェルスクリプトの)、これは間違いなく非常に遅いです。

したがって、オプション(1)と(2)のみが与えられた場合は、オプション(1)を使用しますが、通常は、上記のオプション(0)を使用します。

なぜあなたはそのように少しずつ弦を作り上げるのですか?元のコードを適切なものにするが、縮小されたコードはあまり適切ではないことを示す例に欠けているもの。

v=""
x=$(...)
v="$v$x"
y=$(...)
v="$v$y"
z=$(...)
v="$v$z"

これは、特に、以降のそれぞれを使用する場合、および/またはの中間値を使用する場合(おそらくトリプルドットで表されるコマンドで)、より理にかなっ$x$y$zます$v。使用される連結表記は、Bourneシェルの導関数で機能します。代替+=シェルはより少ないシェルで動作しますが、おそらくわずかに効率的です(「わずかに」に重点を置いています)。

于 2013-03-21T01:59:22.103 に答える
0

移植可能で簡単な方法は、変数に二重引用符と中括弧を使用することです。

VARA="beginning text ${VARB} middle text ${VARC}..."

この方法で空の変数のデフォルト値を設定することもできます

VARA="${VARB:-default text} substring manipulation 1st 3 characters ${VARC:0:3}"

中括弧を使用する$VARaと、 があり、書きたい${VAR}aのに の内容を取得して しまう状況を防ぐことができます。${VARa}

于 2013-03-21T02:11:32.577 に答える