@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/powershell-performance-tuning/#article>
    schema:about <https://comcomponent.com/knowledge/array-append-antipattern/>, <https://comcomponent.com/knowledge/hashtable-lookup/> ;
    schema:mentions <https://comcomponent.com/knowledge/generic-list/>, <https://comcomponent.com/knowledge/foreach-statement/>, <https://comcomponent.com/knowledge/get-content-cmdlet/>, <https://comcomponent.com/knowledge/get-childitem-filter/>, <https://comcomponent.com/knowledge/measure-command/>, <https://comcomponent.com/knowledge/stringbuilder/>, <https://comcomponent.com/knowledge/format-table/>, <https://comcomponent.com/knowledge/write-progress/>, <https://comcomponent.com/knowledge/foreach-object-parallel/>, <https://comcomponent.com/knowledge/string-concat-antipattern/>, <https://comcomponent.com/knowledge/quadratic-slowdown/>, <https://comcomponent.com/knowledge/linear-search-matching/>, <https://comcomponent.com/knowledge/lazy-enumeration/>, <https://comcomponent.com/knowledge/downstream-pipeline-breakage/>, <https://comcomponent.com/knowledge/per-iteration-rendering-cost/>, <https://comcomponent.com/knowledge/post-filter-discard/>, <https://comcomponent.com/knowledge/per-line-object-generation-cost/> .

<https://comcomponent.com/knowledge/array-append-antipattern/> a skos:Concept ;
    skos:prefLabel "配列の+=によるコピー"@ja ;
    skos:definition "PowerShellの配列が固定長であるために、要素追加のたびに新しい配列を作って全要素をコピーする書き方。"@ja ;
    skos:altLabel "$array += $item" ;
    skos:altLabel "配列への追加"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/quadratic-slowdown/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/measure-command/> .

<https://comcomponent.com/knowledge/hashtable-lookup/> a skos:Concept ;
    skos:prefLabel "ハッシュテーブルによる突合"@ja ;
    skos:definition "二重ループの中でWhere-Objectなどによる全件走査を行う突合を、索引(ハッシュテーブル)を1度だけ作りキーで引く形に置き換える高速化手法。"@ja ;
    skos:altLabel "Hashtable Lookup" ;
    skos:altLabel "Group-Object -AsHashTable" ;
    ks:mitigates <https://comcomponent.com/knowledge/linear-search-matching/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/measure-command/> ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/foreach-object-parallel/> .

<https://comcomponent.com/knowledge/quadratic-slowdown/> a skos:Concept ;
    skos:prefLabel "件数の2乗に比例する速度劣化"@ja ;
    skos:definition "配列や文字列の+=など、毎回全体をコピーする操作を繰り返すことで、処理時間が件数の2乗に比例して悪化する現象。"@ja ;
    skos:altLabel "O(n^2)の劣化"@ja .

<https://comcomponent.com/knowledge/string-concat-antipattern/> a skos:Concept ;
    skos:prefLabel "文字列の+=による再生成"@ja ;
    skos:definition "文字列が不変(immutable)であるために、連結のたびに新しい文字列インスタンスを生成する書き方。"@ja ;
    skos:altLabel "$s += \"...\"" ;
    ks:mayCause <https://comcomponent.com/knowledge/quadratic-slowdown/> .

<https://comcomponent.com/knowledge/generic-list/> a skos:Concept ;
    skos:prefLabel "List[T](System.Collections.Generic.List)"@ja ;
    skos:definition "要素の追加が定数時間で行える.NETの可変長コレクション型で、配列の+=の代わりに.Add()で要素を足す。"@ja ;
    skos:altLabel "List<T>" ;
    skos:altLabel "Generic List" ;
    ks:mitigates <https://comcomponent.com/knowledge/quadratic-slowdown/> ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/foreach-object-parallel/> .

<https://comcomponent.com/knowledge/foreach-statement/> a skos:Concept ;
    skos:prefLabel "foreach文"@ja ;
    skos:definition "メモリ上のコレクションを1件ずつ処理する制御構文で、1件あたりのオーバーヘッドがパイプラインより小さく、ループ全体の出力をそのまま変数に集約できる。"@ja ;
    skos:altLabel "foreach Statement" ;
    ks:mitigates <https://comcomponent.com/knowledge/quadratic-slowdown/> .

<https://comcomponent.com/knowledge/stringbuilder/> a skos:Concept ;
    skos:prefLabel "StringBuilder / -join"@ja ;
    skos:definition "不変な文字列の+=連結を避け、可変バッファでの組み立て(StringBuilder)や配列の一括結合(-join)によって文字列連結を高速化する手段。"@ja ;
    skos:altLabel "System.Text.StringBuilder" ;
    ks:mitigates <https://comcomponent.com/knowledge/quadratic-slowdown/> .

<https://comcomponent.com/knowledge/linear-search-matching/> a skos:Concept ;
    skos:prefLabel "二重ループの線形探索による突合"@ja ;
    skos:definition "内側のループで毎回Where-Objectなどによる全件走査を行う突合方法で、比較回数が受注件数×マスター件数のように積になる。"@ja ;
    skos:altLabel "Where-Objectによる全件走査"@ja .

<https://comcomponent.com/knowledge/lazy-enumeration/> a skos:Concept ;
    skos:prefLabel "遅延列挙"@ja ;
    skos:definition "巨大な入力を全件メモリに読み込まず1件ずつ列挙する仕組みで、[System.IO.File]::ReadLinesなどが該当し、foreach文と組み合わせるとメモリを使わずに処理できる。"@ja ;
    skos:altLabel "Lazy Enumeration" ;
    skos:altLabel "File.ReadLines" ;
    ks:mitigates <https://comcomponent.com/knowledge/per-line-object-generation-cost/> .

<https://comcomponent.com/knowledge/get-content-cmdlet/> a skos:Concept ;
    skos:prefLabel "Get-Content"@ja ;
    skos:definition "ファイルを読み込むコマンドレットで、既定では改行区切りで1行ずつオブジェクトとして返し、-Rawで一括読み込み、-ReadCountでまとめ読みができる。"@ja ;
    skos:altLabel "ファイルの行読み込み"@ja ;
    ks:verifiedBy <https://comcomponent.com/knowledge/measure-command/> ;
    ks:mayCause <https://comcomponent.com/knowledge/per-line-object-generation-cost/> .

<https://comcomponent.com/knowledge/measure-command/> a skos:Concept ;
    skos:prefLabel "Measure-Command"@ja ;
    skos:definition "スクリプトブロックやコマンドの実行時間を計測してTimeSpanを返すコマンドレットで、測定対象の出力自体は破棄され結果に含まれない。"@ja ;
    skos:altLabel "実行時間の計測"@ja .

<https://comcomponent.com/knowledge/get-childitem-filter/> a skos:Concept ;
    skos:prefLabel "Get-ChildItemの-Filter"@ja ;
    skos:definition "Get-ChildItemのプロバイダーがオブジェクト取得時に適用する絞り込みパラメーターで、取得後にWhere-Objectで捨てるより効率的とされる。"@ja ;
    skos:altLabel "プロバイダー側の絞り込み"@ja ;
    ks:verifiedBy <https://comcomponent.com/knowledge/measure-command/> ;
    ks:mitigates <https://comcomponent.com/knowledge/post-filter-discard/> .

<https://comcomponent.com/knowledge/format-table/> a skos:Concept ;
    skos:prefLabel "Format-Table/Format-List"@ja ;
    skos:definition "PowerShellの結果を画面表示用に整形するコマンドレットで、通すと結果が元のオブジェクトではなく表示用のフォーマット情報に変わる。"@ja ;
    skos:altLabel "Format-Table / Format-List" ;
    skos:altLabel "Format系コマンドレット"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/downstream-pipeline-breakage/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/measure-command/> .

<https://comcomponent.com/knowledge/downstream-pipeline-breakage/> a skos:Concept ;
    skos:prefLabel "後続パイプラインの破壊"@ja ;
    skos:definition "Format系コマンドレットを出力の途中に挟むことで、後続のコマンドが受け取るオブジェクトが表示用のフォーマットオブジェクトに変わってしまい処理が壊れること。"@ja ;
    skos:altLabel "Format系による後続処理の破壊"@ja .

<https://comcomponent.com/knowledge/write-progress/> a skos:Concept ;
    skos:prefLabel "Write-Progress"@ja ;
    skos:definition "コマンドの進行状況をホストの進捗表示として出すコマンドレットで、リダイレクト可能なデータストリームではなく、ログには残せない。"@ja ;
    skos:altLabel "進捗表示"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/per-iteration-rendering-cost/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/measure-command/> .

<https://comcomponent.com/knowledge/per-iteration-rendering-cost/> a skos:Concept ;
    skos:prefLabel "進捗更新の描画コスト"@ja ;
    skos:definition "ループのたびにWrite-Progressで進捗を更新する描画コストで、更新頻度が高いと処理時間そのものより重くなることがある。"@ja ;
    skos:altLabel "Write-Progressの描画負荷"@ja .

<https://comcomponent.com/knowledge/foreach-object-parallel/> a skos:Concept ;
    skos:prefLabel "ForEach-Object -Parallel"@ja ;
    skos:definition "PowerShell 7.0で追加された、入力の各要素を別のランスペースで並列実行するパラメーターセット。"@ja ;
    skos:altLabel "並列パラメーターセット"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/quadratic-slowdown/> .

<https://comcomponent.com/knowledge/post-filter-discard/> a skos:Concept ;
    skos:prefLabel "取得後にWhere-Objectで捨てる絞り込み"@ja ;
    skos:definition "Get-ChildItemなどでいったん全件取得してからWhere-Objectで不要な項目を捨てる非効率な絞り込み方法。"@ja ;
    skos:altLabel "Post-Filter Discard" .

<https://comcomponent.com/knowledge/per-line-object-generation-cost/> a skos:Concept ;
    skos:prefLabel "1行ごとのオブジェクト生成コスト"@ja ;
    skos:definition "Get-Contentが既定で1行ずつオブジェクトを生成することによるコストで、巨大ファイルを読み込む際に支配的になる。"@ja ;
    skos:altLabel "Get-Contentの行オブジェクト化コスト"@ja .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/array-append-antipattern/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/quadratic-slowdown/> ;
    schema:description "n件を+=で追加すると発生する要素コピーの総数はn(n-1)/2になり、件数の2乗に比例して遅くなる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_arrays> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/string-concat-antipattern/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/quadratic-slowdown/> ;
    schema:description "文字列は不変なので$s += \"line\"は毎回新しい文字列を作り、配列の+=と同じ理由で件数の2乗に比例して遅くなる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.text.stringbuilder> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/generic-list/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/quadratic-slowdown/> ;
    schema:description "List[T]の.Add()は定数時間の追加であるため、件数が増えても2乗の劣化を避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_arrays> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/foreach-statement/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/quadratic-slowdown/> ;
    schema:description "foreach文の出力をそのまま変数へ集約する書き方(PowerShellらしい書き方)も配列の+=を避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_foreach> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/stringbuilder/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/quadratic-slowdown/> ;
    schema:description "StringBuilderの可変バッファでの組み立てや-joinによる一括結合は、文字列版の2乗の劣化を避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.text.stringbuilder> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/hashtable-lookup/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/linear-search-matching/> ;
    schema:description "索引を1度だけ作りキーで引く形にすることで、二重ループの全件比較を件数にほぼ比例する回数まで減らせる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/group-object> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/foreach-statement/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/lazy-enumeration/> ;
    schema:description "巨大なファイルをメモリに載せずforeach文で処理するには、ReadLinesのような遅延列挙のIEnumerableを渡す必要がある。丸かっこ内でコマンドの実行結果を評価すると全件がメモリに載る"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_foreach> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/get-content-cmdlet/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/measure-command/> ;
    schema:description "読み込み方式(既定・-Raw・-ReadCount)ごとの速度差はMeasure-Commandで確認できる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/measure-command> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/get-childitem-filter/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/measure-command/> ;
    schema:description "-Filterの有無による速度差はMeasure-Commandで確認できる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/measure-command> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/hashtable-lookup/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/measure-command/> ;
    schema:description "突合の高速化効果はMeasure-Commandで二重ループ版と比較して確認できる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/measure-command> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/array-append-antipattern/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/measure-command/> ;
    schema:description "配列の+=とList[T]の速度差はMeasure-Commandで比較できる。ただし出力は破棄され表示コストは含まれない点に注意する"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/measure-command> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/format-table/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/downstream-pipeline-breakage/> ;
    schema:description "Format系コマンドレットが生成するフォーマットオブジェクトをパイプラインの途中に挟むと、後続の処理が壊れる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/format-table> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/write-progress/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/per-iteration-rendering-cost/> ;
    schema:description "ループのたびに進捗を更新すると、描画コストが処理時間そのものを上回ることがある"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/write-progress> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/hashtable-lookup/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/foreach-object-parallel/> ;
    schema:description "突合のハッシュ化などアルゴリズムの改善を先に行ってから、並列化を検討すべきである"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.core/foreach-object> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/generic-list/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/foreach-object-parallel/> ;
    schema:description "配列操作の改善などアルゴリズムの修正を先に行ってから、並列化を検討すべきである"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.core/foreach-object> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/foreach-object-parallel/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/quadratic-slowdown/> ;
    schema:description "計算量がO(n^2)のまま並列化しても、コア数の分しか速くならず効果は限定的である"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.core/foreach-object> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/get-childitem-filter/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/post-filter-discard/> ;
    schema:description "-Filterで取得時に絞り込むことで、全件取得してからWhere-Objectで捨てる非効率な方法を避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-childitem> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/get-content-cmdlet/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/per-line-object-generation-cost/> ;
    schema:description "Get-Contentは既定で1行ずつオブジェクトを生成するため、巨大ファイルではこのコストが支配的になる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.management/get-content> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/lazy-enumeration/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/per-line-object-generation-cost/> ;
    schema:description "[System.IO.File]::ReadLinesのような逐次列挙は、1行ごとのオブジェクト生成コストを回避できる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.io.file.readlines> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/format-table/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/measure-command/> ;
    schema:description "Format系コマンドレットを挟むことによる処理コストもMeasure-Commandで確認できる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/measure-command> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/write-progress/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/measure-command/> ;
    schema:description "進捗更新の描画コストもMeasure-Commandで比較できる"@ja ;
    ks:evidence <https://learn.microsoft.com/powershell/module/microsoft.powershell.utility/measure-command> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
