while(1)とwhile(2)のどちらが速いですか?

588
Nikole 2014-07-20 21:32.

これは上級管理職からのインタビューの質問でした。

どちらが速いですか?

while(1) {
    // Some code
}

または

while(2) {
    //Some code
}

内部の式whileは最終的にtrueまたはに評価されるはずなので、両方の実行速度は同じであると言いましたfalse。この場合、両方が評価されtruewhile条件内に追加の条件付き命令はありません。したがって、どちらも実行速度は同じであり、私は(1)の方が好きです。

しかし、インタビュアーは自信を持って言った:「あなたの基本をチェックしてください。while(1)より速いですwhile(2)。」(彼は私の自信をテストしていませんでした)

これは本当ですか?

参照:「for(;;)」は「while(TRUE)」よりも速いですか?そうでなければ、なぜ人々はそれを使うのですか?

22 answers

684
ApproachingDarknessFish 2014-07-20 22:03.

どちらのループも無限ですが、どちらが反復ごとにより多くの命令/リソースを必要とするかがわかります。

gccを使用して、次の2つのプログラムをコンパイルし、さまざまなレベルの最適化でアセンブリしました。

int main(void) {
    while(1) {}
    return 0;
}

int main(void) {
    while(2) {}
    return 0;
}

最適化(-O0)がない場合でも、生成されたアセンブリは両方のプログラムで同一でしたしたがって、2つのループの間に速度の違いはありません。

参考までに、生成されたアセンブリはgcc main.c -S -masm=intel次のとおりです(最適化フラグとともに使用)。

-O0

    .file   "main.c"
    .intel_syntax noprefix
    .def    __main; .scl    2;  .type   32; .endef
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    push    rbp
    .seh_pushreg    rbp
    mov rbp, rsp
    .seh_setframe   rbp, 0
    sub rsp, 32
    .seh_stackalloc 32
    .seh_endprologue
    call    __main
.L2:
    jmp .L2
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

-O1

    .file   "main.c"
    .intel_syntax noprefix
    .def    __main; .scl    2;  .type   32; .endef
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    sub rsp, 40
    .seh_stackalloc 40
    .seh_endprologue
    call    __main
.L2:
    jmp .L2
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

-O2し、-O3(同じ出力):

    .file   "main.c"
    .intel_syntax noprefix
    .def    __main; .scl    2;  .type   32; .endef
    .section    .text.startup,"x"
    .p2align 4,,15
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    sub rsp, 40
    .seh_stackalloc 40
    .seh_endprologue
    call    __main
.L2:
    jmp .L2
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

実際、ループ用に生成されたアセンブリは、最適化のすべてのレベルで同一です。

 .L2:
    jmp .L2
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

重要な点は次のとおりです。

.L2:
    jmp .L2

アセンブリをうまく読み取ることはできませんが、これは明らかに無条件のループです。このjmp命令は.L2、値をtrueと比較することなく、プログラムを無条件にラベルにリセットします。もちろん、プログラムが何らかの理由で終了するまで、すぐに再度リセットします。これは、C / C ++コードに直接対応しています。

L2:
    goto L2;

編集:

興味深いことに、最適化を行わなくても、次のループはすべてjmp、アセンブリでまったく同じ出力(無条件)を生成しました。

while(42) {}

while(1==1) {}

while(2==2) {}

while(4<7) {}

while(3==3 && 4==4) {}

while(8-9 < 0) {}

while(4.3 * 3e4 >= 2 << 6) {}

while(-0.1 + 02) {}

そして驚いたことに:

#include<math.h>

while(sqrt(7)) {}

while(hypot(3,4)) {}

ユーザー定義関数を使用すると、状況が少し興味深いものになります。

int x(void) {
    return 1;
}

while(x()) {}

#include<math.h>

double x(void) {
    return sqrt(7);
}

while(x()) {}

-O0、これらの2つの例は、実際xに各反復の比較を呼び出して実行します。

最初の例(1を返す):

.L4:
    call    x
    testl   %eax, %eax
    jne .L4
    movl    $0, %eax
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

2番目の例(を返すsqrt(7)):

.L4:
    call    x
    xorpd   %xmm1, %xmm1
    ucomisd %xmm1, %xmm0
    jp  .L4
    xorpd   %xmm1, %xmm1
    ucomisd %xmm1, %xmm0
    jne .L4
    movl    $0, %eax
    addq    $32, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .ident  "GCC: (tdm64-2) 4.8.1"

ただし、-O1上記では、どちらも前の例と同じアセンブリを生成します(jmp前のラベルに無条件で戻ります)。

TL; DR

GCCでは、異なるループが同一のアセンブリにコンパイルされます。コンパイラは定数値を評価し、実際の比較を行う必要はありません。

物語の教訓は次のとおりです。

  • C ++ソースコードとCPU命令の間には変換の層があり、この層はパフォーマンスに重要な影響を及ぼします。
  • したがって、ソースコードだけでパフォーマンスを評価することはできません。
  • コンパイラは、そのような些細なケースを最適化するのに十分スマートでなければなりません。プログラマー、ほとんどの場合、それらについて考える時間を無駄にすべきではありません
282
Chris Culter 2014-07-22 19:51.

はい、while(1)はるかに高速よりもwhile(2)人間が読むことのために!while(1)なじみのないコードベースを見ると、作者の意図がすぐにわかり、次の行に進むことができます。

私が見たらwhile(2)、私はおそらく私のトラックに立ち止まって、作者が書いていなかった理由を理解しようとしますwhile(1)。著者の指がキーボード上で滑ったのですか?このコードベースのメンテナは、while(n)ループの見た目を変えるためのあいまいなコメントメカニズムとして使用していますか?壊れた静的分析ツールでの誤った警告の大​​まかな回避策ですか?それとも、これは私が生成されたコードを読んでいるという手がかりですか?それは、不適切な検索と置換のすべてに起因するバグですか、それともマージの誤り、または宇宙線ですか?たぶん、このコード行は劇的に異なることをするはずです。多分それは読むことになっていたwhile(w)while(x2)。ファイルの履歴で作成者を見つけて、「WTF」メールを送信したほうがいいです...そして今、私は私の精神的な文脈を壊しました。while(2)ほんの一瞬while(1)しかかからなかったのに、私の時間は数分かかるかもしれません。

誇張していますが、ほんの少しです。コードの可読性は非常に重要です。そして、それは面接で言及する価値があります!

152
Keith Thompson 2014-07-21 14:35.

特定のオプションのセットを使用して特定のターゲットに対して特定のコンパイラによって生成されたコードを示す既存の回答は、その特定のコンテキストで質問が行われない限り、質問に完全には回答しません(「x86_64にgcc4.7.2を使用するとどちらが高速ですか?デフォルトのオプションで?」など)。

言語定義に関する限り、抽象マシンで while (1)は整数定数1while (2)評価し、整数定数を評価し2ます。どちらの場合も、結果がゼロと等しいかどうかが比較されます。言語標準は、2つの構成の相対的なパフォーマンスについてはまったく何も述べていません。

非常に単純なコンパイラーは、少なくとも最適化を要求せずにコンパイルした場合、2つの形式に対して異なるマシンコードを生成する可能性があると想像できます。

一方、Cコンパイラーは、定数式を必要とするコンテキストに現れる場合、コンパイル時にいくつかの定数式を絶対に評価する必要があります。たとえば、これは次のとおりです。

int n = 4;
switch (n) {
    case 2+2: break;
    case 4:   break;
}

診断が必要です。怠惰なコンパイラには、2+2実行時までの評価を延期するオプションがありません。コンパイラーはコンパイル時に定数式を評価する機能を備えている必要があるため、必要がない場合でもその機能を利用しない理由はありません。

C標準(N1570 6.8.5p4)には、

反復ステートメントを使用すると、制御式が0と等しくなるまで、ループ本体と呼ばれるステートメントが繰り返し実行されます。

したがって、関連する定数式はとで1 == 0あり2 == 0、どちらもint値に評価されます0。(これらの比較は、whileループのセマンティクスに暗黙的に含まれています。実際のC式としては存在しません。)

ひどくナイーブなコンパイラ、2つの構造に対して異なるコードを生成する可能性があります。たとえば、最初の場合は無条件の無限ループ(1特別な場合として扱う)を生成でき、2番目の場合は2 != 0。と同等の明示的な実行時比較を生成できます。しかし、実際にそのように動作するCコンパイラーに遭遇したことはなく、そのようなコンパイラーが存在することを真剣に疑っています。

ほとんどのコンパイラー(すべての製品品質のコンパイラーと言いたくなります)には、追加の最適化を要求するオプションがあります。このようなオプションでは、コンパイラが2つの形式に対して異なるコードを生成する可能性はさらに低くなります。

コンパイラが2つの構造に対して異なるコードを生成する場合は、最初に、異なるコードシーケンスが実際に異なるパフォーマンスを持っているかどうかを確認します。含まれている場合は、最適化オプション(使用可能な場合)を使用してコンパイルを再試行してください。それでも異なる場合は、バグレポートをコンパイラベンダーに提出してください。これは(必然的に)C標準に準拠していないという意味でのバグではありませんが、修正が必要な問題であることはほぼ間違いありません。

結論:while (1)そしてwhile(2) ほぼ確実に同じパフォーマンスを持っています。それらはまったく同じセマンティクスを持っており、コンパイラが同じコードを生成しない理由はありません。

また、コンパイラがのwhile(1)よりも高速なコードを生成することは完全に合法ですが、コンパイラが同じプログラム内の別のオカレンスよりもwhile(2)高速のコードを生成することも同様に合法です。while(1)while(1)

(あなたが尋ねたものに暗黙のうちに別の質問があります:間違った技術的ポイントを主張するインタビュアーにどのように対処しますか。それはおそらく職場サイトにとって良い質問でしょう)。

141
janos 2014-07-25 08:31.

ちょっと待って。インタビュアー、彼はこの男のように見えましたか?

インタビュアー自身がこのインタビューに失敗したこと十分に悪いことです。この会社の他のプログラマーがこのテストに「合格」した場合はどうなるでしょうか。

いいえ。ステートメント1 == 0を評価し、同様に高速である2 == 0 必要があります。私たちは、想像できる1が速く、他のよりもあるかもしれない貧しいコンパイラの実装を。しかし、誰もありません良い1が速く、他のよりあるべき理由は。

主張が真実であるときに何らかのあいまいな状況があったとしても、プログラマーはあいまいな(そしてこの場合は不気味な)雑学の知識に基づいて評価されるべきではありません。このインタビューについて心配する必要はありません。ここでの最善の策は立ち去ることです。

免責事項:これはオリジナルのディルバートの漫画ではありません。これは単なるマッシュアップです。

79
anatolyg 2014-07-20 21:59.

あなたの説明は正しいです。これは、技術的な知識に加えて、あなたの自信をテストする質問のようです。

ちなみに、あなたが答えたら

どちらも完了するまでに無限の時間がかかるため、両方のコードは同じように高速です

インタビュアーは言うだろう

ただし、while (1)1秒あたりの反復回数を増やすことができます。理由を説明できますか?(これはナンセンスです。自信をもう一度テストしてください)

ですから、あなたがしたように答えることによって、あなたはこの悪い質問を議論することに他の方法で浪費するであろう時間を節約しました。


これは、最適化をオフにして、システム(MS Visual Studio 2012)のコンパイラーによって生成されたサンプルコードです。

yyy:
    xor eax, eax
    cmp eax, 1     (or 2, depending on your code)
    je xxx
    jmp yyy
xxx:
    ...

最適化をオンにした場合:

xxx:
    jmp xxx

したがって、生成されたコードは、少なくとも最適化コンパイラーではまったく同じです。

60
Ryan Cavanaugh 2014-07-22 04:41.

質問の最も可能性の高い説明は、インタビュアーが、プロセッサがゼロ以外の値に達するまで、数値の個々のビットを1つずつチェックすると考えていることです。

1 = 00000001
2 = 00000010

「ゼロですか?」アルゴリズムは数値の右側から始まり、ゼロ以外のビットに達するまで各ビットwhile(1) { }をチェックする必要がありwhile(2) { }ます。ループは、反復ごとにループの2倍のビットをチェックする必要があります。

これには、コンピューターの動作について非常に間違ったメンタルモデルが必要ですが、独自の内部ロジックがあります。確認する1つの方法は、以下の場合に依頼するだろうwhile(-1) { }while(3) { }場合も同様に速いだろうか、while(32) { }となり さらに遅いです

32
Tõnu Samuel 2014-07-22 17:17.

もちろん、このマネージャーの本当の意図はわかりませんが、まったく別の見方を提案します。新しいメンバーをチームに採用するとき、彼が対立状況にどのように反応するかを知ることは役に立ちます。

彼らはあなたを紛争に追いやった。これが本当なら、彼らは賢くて、質問は良かったです。銀行などの一部の業界では、問題をStackOverflowに投稿することが拒否の理由になる可能性があります。

しかしもちろん、私にはわかりません。1つのオプションを提案するだけです。

25
OldFrank 2014-07-23 12:30.

手がかりは「上級管理職からの質問」にあると思います。この人は、マネージャーになったときに明らかにプログラミングをやめ、その後、上級マネージャーになるまでに数年かかりました。プログラミングへの興味を失うことはありませんでしたが、当時から一行も書きませんでした。したがって、彼の言及は、いくつかの回答が述べているように「そこにあるまともなコンパイラ」ではなく、「この人が20〜30年前に使用したコンパイラ」です。

当時、プログラマーは、「中央ミニコンピューター」のCPU時間が非常に貴重であったため、コードをより高速かつ効率的にするためのさまざまな方法を試すことにかなりの時間を費やしていました。コンパイラを書く人々がしたように。彼の会社が当時利用可能にしていた唯一のコンパイラは、「最適化できる頻繁に遭遇するステートメント」に基づいて最適化され、while(1)に遭遇したときに少し近道を取り、すべてを評価したと思いますそれ以外の場合、while(2)を含みます。そのような経験をしたことで、彼の立場とそれに対する自信を説明することができました。

あなたを雇うための最良のアプローチは、おそらくあなたが次の面接の主題にスムーズに導く前に、上級管理職が夢中になり、「プログラミングの古き良き時代」についてあなたに2〜3分講義することを可能にするものです。(ここでは適切なタイミングが重要です-速すぎてストーリーを中断しています-遅すぎて、焦点が不十分な人としてラベル付けされます)。面接の最後に、このトピックについてもっと知りたいと思っていることを彼に伝えてください。

19
Valentin Radu 2014-07-20 22:13.

あなたは彼にどうやってその結論に達したのか尋ねるべきだった。そこにあるまともなコンパイラの下では、2つは同じasm命令にコンパイルされます。だから、彼はあなたにコンパイラーにも始めるように言ったはずです。それでも、理論的な知識に基づいた推測を行うには、コンパイラとプラットフォームを十分に理解している必要があります。そして最終的には、メモリの断片化やシステム負荷など、この詳細よりもループに影響を与える他の外部要因があるため、実際には問題にはなりません。

18
ouah 2014-07-24 01:02.

この質問のために、C委員会のDoug Gwynが、オプティマイザーパスのない初期のCコンパイラーの中には、アセンブリーでテストを生成するwhile(1)for(;;)それがない場合と比較して)と書いたことを覚えていることを付け加えておきます。

私はこの歴史的なメモを与えることによってインタビュアーに答え、それから私が非常に驚いたとしても、コンパイラーがこれをしたとしても、コンパイラーは次のことをすることができると言います。

  • オプティマイザせずにコンパイラを渡すの両方のテストを生成while(1)し、while(2)
  • オプティマイザーパスを使用すると、コンパイラーはwhile(1)、慣用的なものと見なされるため、すべてを最適化するように指示されます(無条件ジャンプを使用)。これはwhile(2)テストを残すため、2つの間にパフォーマンスの違いが生じます。

もちろん、インタビュアーに、考慮しないことwhile(1)while(2)、同じ構成が同等の構成であるため、同じ構成が低品質の最適化の兆候であることを追加します。

10
UncleKing 2014-07-23 15:10.

そのような質問に対する別の見方は、上司に彼/彼女が間違っていると言う勇気があるかどうかを確認することです!そして、あなたはそれをどれほど柔らかく伝えることができますか。

私の最初の本能は、適切なコンパイラがそれを処理する必要があることをマネージャに示すためにアセンブリ出力を生成することでした。そうでない場合は、次のパッチを送信します:)

8
Bart Verkoeijen 2014-07-23 21:37.

非常に多くの人々がこの問題を掘り下げているのを見ると、これがどれだけ迅速に物事をマイクロ最適化するかを確認するためのテストになり得る理由が正確にわかります。

私の答えは次のようになります。それほど重要ではありませんが、私はむしろ私たちが解決しているビジネス上の問題に焦点を当てています。結局のところ、それは私が支払われるつもりです。

さらに、私はwhile(1) {}それがより一般的であり、他のチームメートが誰かが1よりも多い数を選ぶ理由を理解するために時間を費やす必要がないので選ぶでしょう。

さあ、コードを書いてみましょう。;-)

6
Tom Tanner 2016-04-01 04:39.

最適化が心配な場合は、

for (;;)

テストがないからです。(皮肉モード)

5
pacoverflow 2014-07-28 07:32.

これは、技術的な質問としてマスクされた行動面接の質問の1つであるように思われます。一部の企業はこれを行っています-有能なプログラマーが答えるのはかなり簡単なはずの技術的な質問をしますが、インタビュイーが正しい答えを出すと、インタビュアーは彼らに間違っていると言います。

会社はあなたがこの状況でどのように反応するかを見たいと思っています。あなたは静かにそこに座って、あなたの答えが正しいと主張しませんか?それは、自己不信またはインタビュアーを怒らせることへの恐れのためです。それとも、あなたが間違っていると知っている権威のある人に挑戦する気がありますか?彼らは、あなたが自分の信念に立ち向かう意思があるかどうか、そしてあなたがそれを巧妙かつ敬意を持って行うことができるかどうかを見たいと思っています。

3
Peter Wooster 2014-07-27 11:55.

この種のナンセンスが違いを生んだかもしれないとき、私はCとアセンブリコードをプログラムして戻しました。それが違いを生んだとき、私たちはそれをアセンブリで書きました。

もし私がその質問をされたら、私はドナルド・クヌースの1974年の有名な時期尚早の最適化についての引用を繰り返し、インタビュアーが笑って先に進まなければ歩きました。

3
Rok Kralj 2014-09-18 22:54.

たぶん、インタビュアーはそのようなばかげた質問を意図的に提起し、あなたに3つのポイントを作ってほしいと思ったのかもしれません。

  1. 基本的な推論。どちらのループも無限であり、パフォーマンスについて話すのは難しいです。
  2. 最適化レベルに関する知識。彼は、コンパイラに最適化を行わせれば、特にブロックが空でない場合に、条件を最適化することを望んでいました。
  3. マイクロプロセッサアーキテクチャに関する知識。ほとんどのアーキテクチャには、0と比較するための特別なCPU命令があります(必ずしも高速である必要はありません)。
2
gnasher729 2014-07-21 14:34.

ここに問題があります。実際にプログラムを作成してその速度を測定すると、両方のループの速度が異なる可能性があります。いくつかの合理的な比較のために:

unsigned long i = 0;
while (1) { if (++i == 1000000000) break; }

unsigned long i = 0;
while (2) { if (++i == 1000000000) break; }

時間を出力するコードを追加すると、ループが1つまたは2つのキャッシュライン内にどのように配置されるかなどのランダムな効果が違いを生む可能性があります。1つのループが完全に1つのキャッシュライン内にあるか、キャッシュラインの先頭にあるか、2つのキャッシュラインにまたがっている可能性があります。その結果、インタビュアーが最も速いと主張するものは、偶然にも実際には最も速い可能性があります。

最悪のシナリオ:最適化コンパイラはループが何をするかを理解しませんが、2番目のループが実行されたときに生成される値が最初のループによって生成される値と同じであることを理解します。そして、最初のループの完全なコードを生成しますが、2番目のループは生成しません。

2
Nikolay Ivanchev 2014-07-22 02:49.

それらは両方とも等しい-同じです。

仕様によれば、0以外のものはすべて真と見なされるため、最適化を行わなくても、優れたコンパイラーはwhile(1)またはwhile(2)のコードを生成しません。コンパイラは、の簡単なチェックを生成し!= 0ます。

2
ekerner 2014-07-25 18:43.

人々がこの非常に単純な質問のテスト、証明、および回答に費やした時間と労力から判断すると、どちらも質問をすることによって非常に遅くなったと言えます。

そして、それにさらに多くの時間を費やすために...

「while(2)」はばかげています。なぜなら、

「while(1)」と「while(true)」は、確実に発生する条件に基づいて、ループ内のある段階で「break」が呼び出されることを期待する無限ループを作成するために歴史的に使用されてきました。

「1」は単に常に真と評価されるために存在するため、「while(2)」と言うのは、「while(1 + 1 == 2)」と言うのと同じくらいばかげており、これも真と評価されます。

そして、あなたが完全に愚かになりたいのなら、ただ使ってください:-

while (1 + 5 - 2 - (1 * 3) == 0.5 - 4 + ((9 * 2) / 4)) {
    if (succeed())
        break;
}

あなたのコーダーがコードの実行に影響を与えないタイプミスをしたと思いますが、彼が意図的に「2」を単に奇妙なものとして使用した場合は、彼があなたのコード全体に奇妙なsh!tを入れる前に彼を解雇してください。読んで作業します。

1
user143522 2014-07-23 20:51.

それはコンパイラに依存します。

コードを最適化する場合、または特定の命令セットに対して同じ数の命令で1と2をtrueと評価する場合、実行速度は同じになります。

実際には、常に同じように高速ですが、これが異なる方法で評価される場合、特定のコンパイラと特定のシステムを想像することは可能です。

つまり、これは実際には言語(C)関連の質問ではありません。

0
Antonin GAVREL 2018-01-28 03:58.

この質問に答えようとしている人は最速のループを望んでいるので、他の回答で述べられているように、両方が同じアセンブリコードに等しくコンパイルされていると答えたでしょう。それでも、「ループ展開」を使用してインタビュアーに提案することができます。whileループの代わりにdo {} whileループ。

注意:ループが少なくとも常に1回実行されるようにする必要があります。

ループの内部にはブレーク条件が必要です。

また、この種のループでは、0以外の整数が機能するため、個人的にはdo {} while(42)を使用することをお勧めします。

0
chqrlie 2019-02-22 09:29.

明らかな答えは次のとおりです。投稿されたとおり、両方のフラグメントが同じようにビジーな無限ループを実行し、プログラムが無限に遅くなります。

Cキーワードをマクロとして再定義すると、技術的には未定義の動作になりますが、どちらかのコードフラグメントを高速にするために考えられる唯一の方法です。2つのフラグメントの上に次の行を追加できます。

#define while(x) sleep(x);

実際、のwhile(1)2倍の速度(または半分の速度)になりwhile(2)ます。

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

Total War:Warhammer:Kotakuレビュー

Total War:Warhammer:Kotakuレビュー

私はこのゲームを嫌う準備ができていました。先週の前に、Total War:Warhammerについての私の考えがありました:それでもここに私は、私の手にある完成品であり、私は変わった男です。

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

スタンディングロックスー族のメンバーと水の保護者は、ノースダコタ州のスタンディングロックにあるオセティサコウィンキャンプを去ります。(Twitter経由のCNNスクリーンショット)火と煙がスカイラインを覆い、スタンディングロックスー族のメンバーと水の保護者が、聖なるものを守りながら建てた家、オセティサコウィン(セブンカウンシルファイアーズ)キャンプから行進し、太鼓を打ち、歌い、祈りました。ダコタアクセスパイプラインとしても知られる「ブラックスネーク」からの土地。

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

写真:APシアーズとKマートは、イヴァンカ・トランプのトランプホームアイテムのコレクションも、誰も購入したくないために削除しました。シアーズとKマートの両方の親会社であるシアーズホールディングスは、土曜日のABCニュースへの声明で、彼らが気にかけていると辛抱強く説明しましたトランプラインを売り続けるにはお金を稼ぐことについてあまりにも多く。

ポテトチップスでたった10分でスペインのトルティーヤを作る

ポテトチップスでたった10分でスペインのトルティーヤを作る

伝統的なスペインのトルティーヤは通常、オリーブオイルで柔らかくなるまで調理されたポテトから始まります(30分以上かかる場合があります)が、ケトルで調理されたポテトチップスの助けを借りてわずか10分でテーブルに置くことができます。上のビデオはすべてがバラバラにならないように裏返す方法を含め、レシピ全体を説明しますが、必要なのは4〜5個の卵と3カップのケトルチップスだけです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language