boost :: coroutine2 vs CoroutineTS

ニサルディルシャン|

Boost :: Coroutine2とCoroutineTS(C ++ 20)は、C ++で人気のあるコルーチンの実装です。どちらも一時停止と再開を行いますが、2つの実装はまったく異なるアプローチに従います。

CoroutineTS(C ++ 20)

  • スタックレス
  • 返品による一時停止
  • 特別なキーワードを使用
generator<int> Generate()
{
   co_yield;
});

boost :: coroutine2

  • スタックフル
  • 電話で一時停止
  • 特別なキーワードは使用しないでください
pull_type source([](push_type& sink)
{
   sink();
});

そのうちの1つだけを選択する必要がある特定のユースケースはありますか?

RmbRT

主な技術的な違いは、ネストされた呼び出し内から譲歩できるようにするかどうかです。これは、スタックレスコルーチンを使用して行うことはできません。

考慮すべきもう1つの点は、スタックフルコルーチンには独自のスタックとコンテキスト(シグナルマスク、スタックポインター、CPUレジスターなど)があるため、スタックレスコルーチンよりもメモリフットプリントが大きいことです。これは、リソースに制約のあるシステムや大量のコルーチンが同時に存在する場合に特に問題になる可能性があります。

現実の世界でパフォーマンスをどのように比較するかはわかりませんが、一般に、スタックレスコルーチンはオーバーヘッドが少ないため、より効率的です(スタックレスタスクスイッチは、スタックを交換したり、レジスタを格納/ロードしたり、信号を復元したりする必要がありません)。マスクなど)。

最小のスタックレスコルーチンの実装の例については、サイモン・タタムのコルーチンを使用ダフのデバイスそれらがあなたが得ることができるのと同じくらい効率的であることはかなり直感的です。

また、この質問には、スタックフルコルーチンとスタックレスコルーチンの違いについて詳しく説明する優れた回答があります。

スタックレスコルーチンでネストされた呼び出しから譲る方法は?  不可能だと言ったとしても、それは100%真実ではありませんでした:これを達成するために(少なくとも2つの)トリックを使用できますが、それぞれにいくつかの欠点があります:まず、呼び出しコルーチンを生成できるはずのすべての呼び出しを変換する必要がありますコルーチンにも。現在、2つの方法があります。

  1. トランポリンのアプローチ:それが戻るまであなたは単に、ループ内の親コルーチンから子コルーチンを呼び出します。子コルーチンに通知するたびに、それが終了しない場合は、呼び出しコルーチンも生成します。このアプローチでは、子コルーチンを直接呼び出すことは禁止されていることに注意してください。常に最も外側のコルーチンを呼び出す必要があり、その後、コールスタック全体に再入力する必要があります。これには、ネストの深さnに対してO(n)の呼び出しと戻りの複雑さがあります。イベントを待っている場合、イベントは単に最も外側のコルーチンに通知する必要があります。

  2. 親リンクのアプローチ:あなたが親コルーチンを得、子コルーチンに親コルーチンアドレスを渡し、それが終了すると、子コルーチンを手動で親コルーチンを再開します。このアプローチでは、最も内側のコルーチン以外のコルーチンを直接呼び出すことは禁止されていることに注意してください。このアプローチは、呼び出しと戻りの複雑さがO(1)であるため、一般的に推奨されます。欠点は、最も内側のコルーチンをどこかに手動で登録する必要があるため、外側のコルーチンを再開したい次のイベントが、どの内側のコルーチンを直接ターゲットにするかを認識できることです。

呼び出しと戻りの複雑さとは、コルーチンに再開を通知するときに実行する手順の数と、呼び出し通知に再び戻るように通知した後に実行する手順を意味します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

boost :: thread vs std :: thread vs pthread

分類Dev

ラムダなしのブーストcoroutine2の使用

分類Dev

Solr bq vs Boost with edismax for Recenty Boosting

分類Dev

Boost rng vs OpenCV rng vs c ++ 11 std :: random?

分類Dev

Coroutine vs Fiber difference clarification

分類Dev

Clang vs gcc std :: crbegin with boost :: iterator_range

分類Dev

std :: string&vs boost :: string_ref

分類Dev

Boost :: asio async_write_some vs async_send

分類Dev

Visual Studio 2013 (vs120) asks for wrong boost libraries

分類Dev

C ++ :: Boost ::理由もなくAccessViolationException(VS13)

分類Dev

2D Graphics Performance Boost

分類Dev

boost :: asio :: write()VSソケット-> write_some()

分類Dev

BOOST_LOG_TRIVIAL vs logrotate(ログを再開)

分類Dev

pycuda vs theano vs pylearn2

分類Dev

How to send subarray of 2d Boost.MultiArray via Boost.MPI?

分類Dev

Ionic 2 vs Xamarin

分類Dev

Windows Boost 1.64VS2017にPythonライブラリがありません

分類Dev

Boost.Localeの例はVS2010では実行されません

分類Dev

2つの条件でboost :: enable_if

分類Dev

Boost geometry register Point 2d as shared pointer

分類Dev

Play2-Auth vs SecureSocial vs Deadbolt2

分類Dev

boost :: python :: import( "cv2")で例外boost :: python :: error_already_setを取得しました

分類Dev

Angular 2 AOT vs JIT

分類Dev

Angular 2 AOT vs JIT

分類Dev

EC2 vs Elastic Beanstalk vs Lambda

分類Dev

ExcelInterlop値vsテキストvs値2

分類Dev

x64でのBoost1.60およびVS2013でのリンカーエラー

分類Dev

CMakeがBoostライブラリを見つけることができません(VS 2017)

分類Dev

実行中のファイル名を取得します:argv [0] vs boost :: filesystem :: current_path()

Related 関連記事

  1. 1

    boost :: thread vs std :: thread vs pthread

  2. 2

    ラムダなしのブーストcoroutine2の使用

  3. 3

    Solr bq vs Boost with edismax for Recenty Boosting

  4. 4

    Boost rng vs OpenCV rng vs c ++ 11 std :: random?

  5. 5

    Coroutine vs Fiber difference clarification

  6. 6

    Clang vs gcc std :: crbegin with boost :: iterator_range

  7. 7

    std :: string&vs boost :: string_ref

  8. 8

    Boost :: asio async_write_some vs async_send

  9. 9

    Visual Studio 2013 (vs120) asks for wrong boost libraries

  10. 10

    C ++ :: Boost ::理由もなくAccessViolationException(VS13)

  11. 11

    2D Graphics Performance Boost

  12. 12

    boost :: asio :: write()VSソケット-> write_some()

  13. 13

    BOOST_LOG_TRIVIAL vs logrotate(ログを再開)

  14. 14

    pycuda vs theano vs pylearn2

  15. 15

    How to send subarray of 2d Boost.MultiArray via Boost.MPI?

  16. 16

    Ionic 2 vs Xamarin

  17. 17

    Windows Boost 1.64VS2017にPythonライブラリがありません

  18. 18

    Boost.Localeの例はVS2010では実行されません

  19. 19

    2つの条件でboost :: enable_if

  20. 20

    Boost geometry register Point 2d as shared pointer

  21. 21

    Play2-Auth vs SecureSocial vs Deadbolt2

  22. 22

    boost :: python :: import( "cv2")で例外boost :: python :: error_already_setを取得しました

  23. 23

    Angular 2 AOT vs JIT

  24. 24

    Angular 2 AOT vs JIT

  25. 25

    EC2 vs Elastic Beanstalk vs Lambda

  26. 26

    ExcelInterlop値vsテキストvs値2

  27. 27

    x64でのBoost1.60およびVS2013でのリンカーエラー

  28. 28

    CMakeがBoostライブラリを見つけることができません(VS 2017)

  29. 29

    実行中のファイル名を取得します:argv [0] vs boost :: filesystem :: current_path()

ホットタグ

アーカイブ