aigroup-workflow 2.2.0 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/fix-build.md +10 -5
- package/.claude/commands/init-project.md +13 -8
- package/.claude/commands/plan.md +15 -8
- package/.claude/commands/review.md +12 -6
- package/.claude/commands/tdd.md +11 -5
- package/.claude/commands/workflow-start.md +20 -11
- package/.claude/settings.json +28 -0
- package/.codex/agents/architect.toml +207 -0
- package/.codex/agents/build-error-resolver.toml +110 -0
- package/.codex/agents/code-reviewer.toml +233 -0
- package/.codex/agents/doc-updater.toml +103 -0
- package/.codex/agents/e2e-runner.toml +103 -0
- package/.codex/agents/get-current-datetime.toml +23 -0
- package/.codex/agents/init-architect.toml +181 -0
- package/.codex/agents/planner.toml +208 -0
- package/.codex/agents/refactor-cleaner.toml +81 -0
- package/.codex/agents/rust-reviewer.toml +90 -0
- package/.codex/agents/security-reviewer.toml +104 -0
- package/.codex/agents/tdd-guide.toml +87 -0
- package/AGENTS.md +2 -2
- package/CLAUDE.md +23 -1
- package/LICENSE +20 -20
- package/README.md +333 -333
- package/agents/a11y-architect.md +141 -141
- package/agents/architect.md +211 -211
- package/agents/build-error-resolver.md +114 -114
- package/agents/chief-of-staff.md +151 -151
- package/agents/code-architect.md +71 -71
- package/agents/code-explorer.md +69 -69
- package/agents/code-reviewer.md +237 -237
- package/agents/code-simplifier.md +47 -47
- package/agents/comment-analyzer.md +45 -45
- package/agents/conversation-analyzer.md +52 -52
- package/agents/cpp-build-resolver.md +90 -90
- package/agents/cpp-reviewer.md +72 -72
- package/agents/csharp-reviewer.md +101 -101
- package/agents/dart-build-resolver.md +201 -201
- package/agents/database-reviewer.md +91 -91
- package/agents/doc-updater.md +107 -107
- package/agents/docs-lookup.md +68 -68
- package/agents/e2e-runner.md +107 -107
- package/agents/flutter-reviewer.md +243 -243
- package/agents/gan-evaluator.md +209 -209
- package/agents/gan-generator.md +131 -131
- package/agents/gan-planner.md +99 -99
- package/agents/get-current-datetime.md +26 -26
- package/agents/go-build-resolver.md +94 -94
- package/agents/go-reviewer.md +76 -76
- package/agents/harness-optimizer.md +35 -35
- package/agents/healthcare-reviewer.md +83 -83
- package/agents/java-build-resolver.md +153 -153
- package/agents/java-reviewer.md +92 -92
- package/agents/kotlin-build-resolver.md +118 -118
- package/agents/kotlin-reviewer.md +159 -159
- package/agents/loop-operator.md +36 -36
- package/agents/opensource-forker.md +198 -198
- package/agents/opensource-packager.md +249 -249
- package/agents/opensource-sanitizer.md +188 -188
- package/agents/performance-optimizer.md +446 -446
- package/agents/planner.md +212 -212
- package/agents/pr-test-analyzer.md +45 -45
- package/agents/python-reviewer.md +98 -98
- package/agents/pytorch-build-resolver.md +120 -120
- package/agents/refactor-cleaner.md +85 -85
- package/agents/rust-build-resolver.md +148 -148
- package/agents/rust-reviewer.md +94 -94
- package/agents/security-reviewer.md +108 -108
- package/agents/seo-specialist.md +59 -59
- package/agents/silent-failure-hunter.md +50 -50
- package/agents/tdd-guide.md +91 -91
- package/agents/type-design-analyzer.md +41 -41
- package/agents/typescript-reviewer.md +112 -112
- package/cli/commands/update.mjs +1 -1
- package/cli/utils/scaffold.mjs +53 -0
- package/docs/rules/agents.md +166 -50
- package/docs/rules/cpp/coding-style.md +44 -44
- package/docs/rules/cpp/hooks.md +39 -39
- package/docs/rules/cpp/patterns.md +51 -51
- package/docs/rules/cpp/security.md +51 -51
- package/docs/rules/cpp/testing.md +44 -44
- package/docs/rules/csharp/coding-style.md +72 -72
- package/docs/rules/csharp/hooks.md +25 -25
- package/docs/rules/csharp/patterns.md +50 -50
- package/docs/rules/csharp/security.md +58 -58
- package/docs/rules/csharp/testing.md +46 -46
- package/docs/rules/dart/coding-style.md +159 -159
- package/docs/rules/dart/hooks.md +66 -66
- package/docs/rules/dart/patterns.md +261 -261
- package/docs/rules/dart/security.md +135 -135
- package/docs/rules/dart/testing.md +215 -215
- package/docs/rules/golang/coding-style.md +32 -32
- package/docs/rules/golang/hooks.md +17 -17
- package/docs/rules/golang/patterns.md +45 -45
- package/docs/rules/golang/security.md +34 -34
- package/docs/rules/golang/testing.md +31 -31
- package/docs/rules/java/coding-style.md +114 -114
- package/docs/rules/java/hooks.md +18 -18
- package/docs/rules/java/patterns.md +146 -146
- package/docs/rules/java/security.md +100 -100
- package/docs/rules/java/testing.md +131 -131
- package/docs/rules/kotlin/coding-style.md +86 -86
- package/docs/rules/kotlin/hooks.md +17 -17
- package/docs/rules/kotlin/patterns.md +146 -146
- package/docs/rules/kotlin/security.md +82 -82
- package/docs/rules/kotlin/testing.md +128 -128
- package/docs/rules/perl/coding-style.md +46 -46
- package/docs/rules/perl/hooks.md +22 -22
- package/docs/rules/perl/patterns.md +76 -76
- package/docs/rules/perl/security.md +69 -69
- package/docs/rules/perl/testing.md +54 -54
- package/docs/rules/php/coding-style.md +40 -40
- package/docs/rules/php/hooks.md +24 -24
- package/docs/rules/php/patterns.md +33 -33
- package/docs/rules/php/security.md +37 -37
- package/docs/rules/php/testing.md +39 -39
- package/docs/rules/python/coding-style.md +42 -42
- package/docs/rules/python/hooks.md +19 -19
- package/docs/rules/python/patterns.md +39 -39
- package/docs/rules/python/security.md +30 -30
- package/docs/rules/python/testing.md +38 -38
- package/docs/rules/rust/coding-style.md +151 -151
- package/docs/rules/rust/hooks.md +16 -16
- package/docs/rules/rust/patterns.md +168 -168
- package/docs/rules/rust/security.md +141 -141
- package/docs/rules/rust/testing.md +154 -154
- package/docs/rules/swift/coding-style.md +47 -47
- package/docs/rules/swift/hooks.md +20 -20
- package/docs/rules/swift/patterns.md +66 -66
- package/docs/rules/swift/security.md +33 -33
- package/docs/rules/swift/testing.md +45 -45
- package/docs/rules/typescript/coding-style.md +199 -199
- package/docs/rules/typescript/hooks.md +22 -22
- package/docs/rules/typescript/patterns.md +52 -52
- package/docs/rules/typescript/security.md +28 -28
- package/docs/rules/typescript/testing.md +18 -18
- package/docs/rules/web/coding-style.md +96 -96
- package/docs/rules/web/design-quality.md +62 -62
- package/docs/rules/web/hooks.md +120 -120
- package/docs/rules/web/patterns.md +79 -79
- package/docs/rules/web/performance.md +64 -64
- package/docs/rules/web/security.md +57 -57
- package/docs/rules/web/testing.md +55 -55
- package/docs/templates/README.md +36 -36
- package/docs/templates/ai-project-final.md +124 -124
- package/docs/templates/ai-project.md +105 -105
- package/docs/templates/api.md +157 -157
- package/docs/templates/bug.md +62 -62
- package/docs/templates/code-review.md +87 -87
- package/docs/templates/generic.md +116 -116
- package/docs/templates/implementation-plan.md +1 -1
- package/docs/templates/meeting.md +68 -68
- package/docs/templates/prd.md +98 -98
- package/docs/templates/ui.md +134 -134
- package/docs/workflow-pipeline.md +11 -10
- package/package.json +40 -39
- package/scripts/hooks/checks/orchestration-artifacts.cjs +28 -23
- package/scripts/hooks/checks/workflow-state.cjs +4 -5
- package/scripts/orchestration/lib/orchestrator.cjs +344 -117
- package/scripts/orchestration/lib/validate.cjs +145 -0
- package/scripts/orchestration/session.cjs +88 -44
- package/skills/SUPERPOWERS-LICENSE +21 -21
- package/skills/ai-ml/fine-tuning-expert/SKILL.md +162 -162
- package/skills/ai-ml/fine-tuning-expert/references/dataset-preparation.md +540 -540
- package/skills/ai-ml/fine-tuning-expert/references/deployment-optimization.md +673 -673
- package/skills/ai-ml/fine-tuning-expert/references/evaluation-metrics.md +597 -597
- package/skills/ai-ml/fine-tuning-expert/references/hyperparameter-tuning.md +565 -565
- package/skills/ai-ml/fine-tuning-expert/references/lora-peft.md +347 -347
- package/skills/ai-ml/ml-pipeline/SKILL.md +159 -159
- package/skills/ai-ml/ml-pipeline/references/experiment-tracking.md +833 -833
- package/skills/ai-ml/ml-pipeline/references/feature-engineering.md +631 -631
- package/skills/ai-ml/ml-pipeline/references/model-validation.md +978 -978
- package/skills/ai-ml/ml-pipeline/references/pipeline-orchestration.md +907 -907
- package/skills/ai-ml/ml-pipeline/references/training-pipelines.md +782 -782
- package/skills/ai-ml/rag-architect/SKILL.md +194 -194
- package/skills/ai-ml/rag-architect/references/chunking-strategies.md +878 -878
- package/skills/ai-ml/rag-architect/references/embedding-models.md +561 -561
- package/skills/ai-ml/rag-architect/references/rag-evaluation.md +833 -833
- package/skills/ai-ml/rag-architect/references/retrieval-optimization.md +795 -795
- package/skills/ai-ml/rag-architect/references/vector-databases.md +589 -589
- package/skills/ai-ml/spark-engineer/SKILL.md +148 -148
- package/skills/ai-ml/spark-engineer/references/partitioning-caching.md +543 -543
- package/skills/ai-ml/spark-engineer/references/performance-tuning.md +544 -544
- package/skills/ai-ml/spark-engineer/references/rdd-operations.md +599 -599
- package/skills/ai-ml/spark-engineer/references/spark-sql-dataframes.md +474 -474
- package/skills/ai-ml/spark-engineer/references/streaming-patterns.md +786 -786
- package/skills/backend/api-designer/SKILL.md +217 -217
- package/skills/backend/api-designer/references/error-handling.md +541 -541
- package/skills/backend/api-designer/references/openapi.md +824 -824
- package/skills/backend/api-designer/references/pagination.md +494 -494
- package/skills/backend/api-designer/references/rest-patterns.md +335 -335
- package/skills/backend/api-designer/references/versioning.md +391 -391
- package/skills/backend/architecture-designer/SKILL.md +117 -117
- package/skills/backend/architecture-designer/references/adr-template.md +116 -116
- package/skills/backend/architecture-designer/references/architecture-patterns.md +111 -111
- package/skills/backend/architecture-designer/references/database-selection.md +102 -102
- package/skills/backend/architecture-designer/references/nfr-checklist.md +112 -112
- package/skills/backend/architecture-designer/references/system-design.md +100 -100
- package/skills/backend/code-documenter/SKILL.md +147 -147
- package/skills/backend/code-documenter/references/api-docs-fastapi-django.md +166 -166
- package/skills/backend/code-documenter/references/api-docs-nestjs-express.md +220 -220
- package/skills/backend/code-documenter/references/coverage-reports.md +125 -125
- package/skills/backend/code-documenter/references/documentation-systems.md +333 -333
- package/skills/backend/code-documenter/references/interactive-api-docs.md +531 -531
- package/skills/backend/code-documenter/references/python-docstrings.md +121 -121
- package/skills/backend/code-documenter/references/typescript-jsdoc.md +145 -145
- package/skills/backend/code-documenter/references/user-guides-tutorials.md +530 -530
- package/skills/backend/debugging-wizard/SKILL.md +105 -105
- package/skills/backend/debugging-wizard/references/common-patterns.md +132 -132
- package/skills/backend/debugging-wizard/references/debugging-tools.md +140 -140
- package/skills/backend/debugging-wizard/references/quick-fixes.md +177 -177
- package/skills/backend/debugging-wizard/references/strategies.md +142 -142
- package/skills/backend/debugging-wizard/references/systematic-debugging.md +367 -367
- package/skills/backend/feature-forge/SKILL.md +98 -98
- package/skills/backend/feature-forge/references/acceptance-criteria.md +104 -104
- package/skills/backend/feature-forge/references/ears-syntax.md +99 -99
- package/skills/backend/feature-forge/references/interview-questions.md +150 -150
- package/skills/backend/feature-forge/references/pre-discovery-subagents.md +54 -54
- package/skills/backend/feature-forge/references/specification-template.md +103 -103
- package/skills/backend/fullstack-guardian/SKILL.md +105 -105
- package/skills/backend/fullstack-guardian/references/api-design-standards.md +307 -307
- package/skills/backend/fullstack-guardian/references/architecture-decisions.md +350 -350
- package/skills/backend/fullstack-guardian/references/backend-patterns.md +237 -237
- package/skills/backend/fullstack-guardian/references/common-patterns.md +134 -134
- package/skills/backend/fullstack-guardian/references/deliverables-checklist.md +354 -354
- package/skills/backend/fullstack-guardian/references/design-template.md +91 -91
- package/skills/backend/fullstack-guardian/references/error-handling.md +135 -135
- package/skills/backend/fullstack-guardian/references/frontend-patterns.md +340 -340
- package/skills/backend/fullstack-guardian/references/integration-patterns.md +333 -333
- package/skills/backend/fullstack-guardian/references/security-checklist.md +106 -106
- package/skills/backend/graphql-architect/SKILL.md +146 -146
- package/skills/backend/graphql-architect/references/federation.md +418 -418
- package/skills/backend/graphql-architect/references/migration-from-rest.md +1141 -1141
- package/skills/backend/graphql-architect/references/resolvers.md +425 -425
- package/skills/backend/graphql-architect/references/schema-design.md +393 -393
- package/skills/backend/graphql-architect/references/security.md +569 -569
- package/skills/backend/graphql-architect/references/subscriptions.md +510 -510
- package/skills/backend/legacy-modernizer/SKILL.md +137 -137
- package/skills/backend/legacy-modernizer/references/legacy-testing.md +381 -381
- package/skills/backend/legacy-modernizer/references/migration-strategies.md +423 -423
- package/skills/backend/legacy-modernizer/references/refactoring-patterns.md +395 -395
- package/skills/backend/legacy-modernizer/references/strangler-fig-pattern.md +281 -281
- package/skills/backend/legacy-modernizer/references/system-assessment.md +487 -487
- package/skills/backend/microservices-architect/SKILL.md +164 -164
- package/skills/backend/microservices-architect/references/communication.md +499 -499
- package/skills/backend/microservices-architect/references/data.md +721 -721
- package/skills/backend/microservices-architect/references/decomposition.md +344 -344
- package/skills/backend/microservices-architect/references/observability.md +805 -805
- package/skills/backend/microservices-architect/references/patterns.md +603 -603
- package/skills/database/database-optimizer/SKILL.md +147 -147
- package/skills/database/database-optimizer/references/index-strategies.md +331 -331
- package/skills/database/database-optimizer/references/monitoring-analysis.md +501 -501
- package/skills/database/database-optimizer/references/mysql-tuning.md +452 -452
- package/skills/database/database-optimizer/references/postgresql-tuning.md +413 -413
- package/skills/database/database-optimizer/references/query-optimization.md +251 -251
- package/skills/database/postgres-pro/SKILL.md +152 -152
- package/skills/database/postgres-pro/references/extensions.md +404 -404
- package/skills/database/postgres-pro/references/jsonb.md +321 -321
- package/skills/database/postgres-pro/references/maintenance.md +481 -481
- package/skills/database/postgres-pro/references/performance.md +265 -265
- package/skills/database/postgres-pro/references/replication.md +446 -446
- package/skills/database/sql-pro/SKILL.md +129 -129
- package/skills/database/sql-pro/references/database-design.md +402 -402
- package/skills/database/sql-pro/references/dialect-differences.md +419 -419
- package/skills/database/sql-pro/references/optimization.md +384 -384
- package/skills/database/sql-pro/references/query-patterns.md +285 -285
- package/skills/database/sql-pro/references/window-functions.md +328 -328
- package/skills/dotnet/csharp-developer/SKILL.md +125 -125
- package/skills/dotnet/csharp-developer/references/aspnet-core.md +394 -394
- package/skills/dotnet/csharp-developer/references/blazor.md +553 -553
- package/skills/dotnet/csharp-developer/references/entity-framework.md +409 -409
- package/skills/dotnet/csharp-developer/references/modern-csharp.md +248 -248
- package/skills/dotnet/csharp-developer/references/performance.md +498 -498
- package/skills/dotnet/dotnet-core-expert/SKILL.md +138 -138
- package/skills/dotnet/dotnet-core-expert/references/authentication.md +546 -546
- package/skills/dotnet/dotnet-core-expert/references/clean-architecture.md +455 -455
- package/skills/dotnet/dotnet-core-expert/references/cloud-native.md +548 -548
- package/skills/dotnet/dotnet-core-expert/references/entity-framework.md +440 -440
- package/skills/dotnet/dotnet-core-expert/references/minimal-apis.md +319 -319
- package/skills/frontend/angular-architect/SKILL.md +152 -152
- package/skills/frontend/angular-architect/references/components.md +297 -297
- package/skills/frontend/angular-architect/references/ngrx.md +401 -401
- package/skills/frontend/angular-architect/references/routing.md +361 -361
- package/skills/frontend/angular-architect/references/rxjs.md +319 -319
- package/skills/frontend/angular-architect/references/testing.md +405 -405
- package/skills/frontend/design-commands/design.md +91 -91
- package/skills/frontend/design-commands/handoff.md +97 -97
- package/skills/frontend/design-commands/prototype.md +120 -120
- package/skills/frontend/design-commands/spec.md +160 -160
- package/skills/frontend/design-commands/style.md +78 -78
- package/skills/frontend/flutter-expert/SKILL.md +138 -138
- package/skills/frontend/flutter-expert/references/bloc-state.md +259 -259
- package/skills/frontend/flutter-expert/references/gorouter-navigation.md +119 -119
- package/skills/frontend/flutter-expert/references/performance.md +99 -99
- package/skills/frontend/flutter-expert/references/project-structure.md +118 -118
- package/skills/frontend/flutter-expert/references/riverpod-state.md +130 -130
- package/skills/frontend/flutter-expert/references/widget-patterns.md +123 -123
- package/skills/frontend/nextjs-developer/SKILL.md +143 -143
- package/skills/frontend/nextjs-developer/references/app-router.md +311 -311
- package/skills/frontend/nextjs-developer/references/data-fetching.md +482 -482
- package/skills/frontend/nextjs-developer/references/deployment.md +545 -545
- package/skills/frontend/nextjs-developer/references/server-actions.md +462 -462
- package/skills/frontend/nextjs-developer/references/server-components.md +384 -384
- package/skills/frontend/react-expert/SKILL.md +149 -149
- package/skills/frontend/react-expert/references/hooks-patterns.md +162 -162
- package/skills/frontend/react-expert/references/migration-class-to-modern.md +1119 -1119
- package/skills/frontend/react-expert/references/performance.md +168 -168
- package/skills/frontend/react-expert/references/react-19-features.md +174 -174
- package/skills/frontend/react-expert/references/server-components.md +143 -143
- package/skills/frontend/react-expert/references/state-management.md +171 -171
- package/skills/frontend/react-expert/references/testing-react.md +174 -174
- package/skills/frontend/react-native-expert/SKILL.md +185 -185
- package/skills/frontend/react-native-expert/references/expo-router.md +187 -187
- package/skills/frontend/react-native-expert/references/list-optimization.md +204 -204
- package/skills/frontend/react-native-expert/references/platform-handling.md +188 -188
- package/skills/frontend/react-native-expert/references/project-structure.md +171 -171
- package/skills/frontend/react-native-expert/references/storage-hooks.md +173 -173
- package/skills/frontend/senior-frontend/SKILL.md +477 -477
- package/skills/frontend/senior-frontend/references/frontend_best_practices.md +806 -806
- package/skills/frontend/senior-frontend/references/nextjs_optimization_guide.md +724 -724
- package/skills/frontend/senior-frontend/references/react_patterns.md +746 -746
- package/skills/frontend/senior-frontend/scripts/bundle_analyzer.py +407 -407
- package/skills/frontend/senior-frontend/scripts/component_generator.py +329 -329
- package/skills/frontend/senior-frontend/scripts/frontend_scaffolder.py +1005 -1005
- package/skills/frontend/ui-ux-pro-max/SKILL.md +386 -386
- package/skills/frontend/ui-ux-pro-max/data/charts.csv +26 -26
- package/skills/frontend/ui-ux-pro-max/data/colors.csv +97 -97
- package/skills/frontend/ui-ux-pro-max/data/icons.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/landing.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/data/products.csv +96 -96
- package/skills/frontend/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/skills/frontend/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/skills/frontend/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/skills/frontend/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/skills/frontend/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/skills/frontend/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/skills/frontend/ui-ux-pro-max/data/styles.csv +68 -68
- package/skills/frontend/ui-ux-pro-max/data/typography.csv +57 -57
- package/skills/frontend/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/skills/frontend/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/scripts/core.py +253 -253
- package/skills/frontend/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/skills/frontend/ui-ux-pro-max/scripts/search.py +114 -114
- package/skills/frontend/vue-expert/SKILL.md +98 -98
- package/skills/frontend/vue-expert/references/build-tooling.md +480 -480
- package/skills/frontend/vue-expert/references/components.md +448 -448
- package/skills/frontend/vue-expert/references/composition-api.md +299 -299
- package/skills/frontend/vue-expert/references/mobile-hybrid.md +636 -636
- package/skills/frontend/vue-expert/references/nuxt.md +669 -669
- package/skills/frontend/vue-expert/references/state-management.md +449 -449
- package/skills/frontend/vue-expert/references/typescript.md +584 -584
- package/skills/frontend/vue-expert-js/SKILL.md +167 -167
- package/skills/frontend/vue-expert-js/references/component-architecture.md +219 -219
- package/skills/frontend/vue-expert-js/references/composables-patterns.md +183 -183
- package/skills/frontend/vue-expert-js/references/jsdoc-typing.md +535 -535
- package/skills/frontend/vue-expert-js/references/state-management.md +249 -249
- package/skills/frontend/vue-expert-js/references/testing-patterns.md +237 -237
- package/skills/go-rust-cpp/cpp-pro/SKILL.md +115 -115
- package/skills/go-rust-cpp/cpp-pro/references/build-tooling.md +440 -440
- package/skills/go-rust-cpp/cpp-pro/references/concurrency.md +437 -437
- package/skills/go-rust-cpp/cpp-pro/references/memory-performance.md +397 -397
- package/skills/go-rust-cpp/cpp-pro/references/modern-cpp.md +304 -304
- package/skills/go-rust-cpp/cpp-pro/references/templates.md +357 -357
- package/skills/go-rust-cpp/golang-pro/SKILL.md +122 -122
- package/skills/go-rust-cpp/golang-pro/references/concurrency.md +329 -329
- package/skills/go-rust-cpp/golang-pro/references/generics.md +442 -442
- package/skills/go-rust-cpp/golang-pro/references/interfaces.md +432 -432
- package/skills/go-rust-cpp/golang-pro/references/project-structure.md +477 -477
- package/skills/go-rust-cpp/golang-pro/references/testing.md +451 -451
- package/skills/go-rust-cpp/rust-engineer/SKILL.md +167 -167
- package/skills/go-rust-cpp/rust-engineer/references/async.md +458 -458
- package/skills/go-rust-cpp/rust-engineer/references/error-handling.md +334 -334
- package/skills/go-rust-cpp/rust-engineer/references/ownership.md +278 -278
- package/skills/go-rust-cpp/rust-engineer/references/testing.md +470 -470
- package/skills/go-rust-cpp/rust-engineer/references/traits.md +413 -413
- package/skills/infra/cli-developer/SKILL.md +113 -113
- package/skills/infra/cli-developer/references/design-patterns.md +221 -221
- package/skills/infra/cli-developer/references/go-cli.md +540 -540
- package/skills/infra/cli-developer/references/node-cli.md +383 -383
- package/skills/infra/cli-developer/references/python-cli.md +422 -422
- package/skills/infra/cli-developer/references/ux-patterns.md +448 -448
- package/skills/infra/cloud-architect/SKILL.md +216 -216
- package/skills/infra/cloud-architect/references/aws.md +394 -394
- package/skills/infra/cloud-architect/references/azure.md +562 -562
- package/skills/infra/cloud-architect/references/cost.md +582 -582
- package/skills/infra/cloud-architect/references/gcp.md +633 -633
- package/skills/infra/cloud-architect/references/multi-cloud.md +483 -483
- package/skills/infra/devops-engineer/SKILL.md +144 -144
- package/skills/infra/devops-engineer/references/deployment-strategies.md +241 -241
- package/skills/infra/devops-engineer/references/docker-patterns.md +113 -113
- package/skills/infra/devops-engineer/references/github-actions.md +139 -139
- package/skills/infra/devops-engineer/references/incident-response.md +331 -331
- package/skills/infra/devops-engineer/references/kubernetes.md +154 -154
- package/skills/infra/devops-engineer/references/platform-engineering.md +417 -417
- package/skills/infra/devops-engineer/references/release-automation.md +527 -527
- package/skills/infra/devops-engineer/references/terraform-iac.md +141 -141
- package/skills/infra/kubernetes-specialist/SKILL.md +241 -241
- package/skills/infra/kubernetes-specialist/references/configuration.md +452 -452
- package/skills/infra/kubernetes-specialist/references/cost-optimization.md +458 -458
- package/skills/infra/kubernetes-specialist/references/custom-operators.md +563 -563
- package/skills/infra/kubernetes-specialist/references/gitops.md +530 -530
- package/skills/infra/kubernetes-specialist/references/helm-charts.md +912 -912
- package/skills/infra/kubernetes-specialist/references/multi-cluster.md +507 -507
- package/skills/infra/kubernetes-specialist/references/networking.md +447 -447
- package/skills/infra/kubernetes-specialist/references/service-mesh.md +459 -459
- package/skills/infra/kubernetes-specialist/references/storage.md +535 -535
- package/skills/infra/kubernetes-specialist/references/troubleshooting.md +414 -414
- package/skills/infra/kubernetes-specialist/references/workloads.md +377 -377
- package/skills/infra/mcp-developer/SKILL.md +143 -143
- package/skills/infra/mcp-developer/references/protocol.md +244 -244
- package/skills/infra/mcp-developer/references/python-sdk.md +367 -367
- package/skills/infra/mcp-developer/references/resources.md +554 -554
- package/skills/infra/mcp-developer/references/tools.md +480 -480
- package/skills/infra/mcp-developer/references/typescript-sdk.md +350 -350
- package/skills/infra/monitoring-expert/SKILL.md +176 -176
- package/skills/infra/monitoring-expert/references/alerting-rules.md +141 -141
- package/skills/infra/monitoring-expert/references/application-profiling.md +331 -331
- package/skills/infra/monitoring-expert/references/capacity-planning.md +344 -344
- package/skills/infra/monitoring-expert/references/dashboards.md +126 -126
- package/skills/infra/monitoring-expert/references/opentelemetry.md +123 -123
- package/skills/infra/monitoring-expert/references/performance-testing.md +269 -269
- package/skills/infra/monitoring-expert/references/prometheus-metrics.md +136 -136
- package/skills/infra/monitoring-expert/references/structured-logging.md +142 -142
- package/skills/infra/sre-engineer/SKILL.md +181 -181
- package/skills/infra/sre-engineer/references/automation-toil.md +492 -492
- package/skills/infra/sre-engineer/references/error-budget-policy.md +334 -334
- package/skills/infra/sre-engineer/references/incident-chaos.md +576 -576
- package/skills/infra/sre-engineer/references/monitoring-alerting.md +424 -424
- package/skills/infra/sre-engineer/references/slo-sli-management.md +238 -238
- package/skills/infra/terraform-engineer/SKILL.md +143 -143
- package/skills/infra/terraform-engineer/references/best-practices.md +583 -583
- package/skills/infra/terraform-engineer/references/module-patterns.md +297 -297
- package/skills/infra/terraform-engineer/references/providers.md +452 -452
- package/skills/infra/terraform-engineer/references/state-management.md +371 -371
- package/skills/infra/terraform-engineer/references/testing.md +486 -486
- package/skills/infra/websocket-engineer/SKILL.md +168 -168
- package/skills/infra/websocket-engineer/references/alternatives.md +391 -391
- package/skills/infra/websocket-engineer/references/patterns.md +400 -400
- package/skills/infra/websocket-engineer/references/protocol.md +195 -195
- package/skills/infra/websocket-engineer/references/scaling.md +333 -333
- package/skills/infra/websocket-engineer/references/security.md +474 -474
- package/skills/java/java-architect/SKILL.md +132 -132
- package/skills/java/java-architect/references/jpa-optimization.md +393 -393
- package/skills/java/java-architect/references/reactive-webflux.md +356 -356
- package/skills/java/java-architect/references/spring-boot-setup.md +269 -269
- package/skills/java/java-architect/references/spring-security.md +445 -445
- package/skills/java/java-architect/references/testing-patterns.md +500 -500
- package/skills/java/kotlin-specialist/SKILL.md +147 -147
- package/skills/java/kotlin-specialist/references/android-compose.md +419 -419
- package/skills/java/kotlin-specialist/references/coroutines-flow.md +276 -276
- package/skills/java/kotlin-specialist/references/dsl-idioms.md +421 -421
- package/skills/java/kotlin-specialist/references/ktor-server.md +426 -426
- package/skills/java/kotlin-specialist/references/multiplatform-kmp.md +380 -380
- package/skills/java/spring-boot-engineer/SKILL.md +195 -195
- package/skills/java/spring-boot-engineer/references/cloud.md +498 -498
- package/skills/java/spring-boot-engineer/references/data.md +381 -381
- package/skills/java/spring-boot-engineer/references/security.md +459 -459
- package/skills/java/spring-boot-engineer/references/testing.md +545 -545
- package/skills/java/spring-boot-engineer/references/web.md +295 -295
- package/skills/javascript/javascript-pro/SKILL.md +132 -132
- package/skills/javascript/javascript-pro/references/async-patterns.md +334 -334
- package/skills/javascript/javascript-pro/references/browser-apis.md +398 -398
- package/skills/javascript/javascript-pro/references/modern-syntax.md +272 -272
- package/skills/javascript/javascript-pro/references/modules.md +357 -357
- package/skills/javascript/javascript-pro/references/node-essentials.md +471 -471
- package/skills/javascript/nestjs-expert/SKILL.md +206 -206
- package/skills/javascript/nestjs-expert/references/authentication.md +166 -166
- package/skills/javascript/nestjs-expert/references/controllers-routing.md +111 -111
- package/skills/javascript/nestjs-expert/references/dtos-validation.md +153 -153
- package/skills/javascript/nestjs-expert/references/migration-from-express.md +1237 -1237
- package/skills/javascript/nestjs-expert/references/services-di.md +140 -140
- package/skills/javascript/nestjs-expert/references/testing-patterns.md +186 -186
- package/skills/javascript/typescript-pro/SKILL.md +145 -145
- package/skills/javascript/typescript-pro/references/advanced-types.md +259 -259
- package/skills/javascript/typescript-pro/references/configuration.md +445 -445
- package/skills/javascript/typescript-pro/references/patterns.md +484 -484
- package/skills/javascript/typescript-pro/references/type-guards.md +352 -352
- package/skills/javascript/typescript-pro/references/utility-types.md +329 -329
- package/skills/php/laravel-specialist/SKILL.md +262 -262
- package/skills/php/laravel-specialist/references/eloquent.md +351 -351
- package/skills/php/laravel-specialist/references/livewire.md +512 -512
- package/skills/php/laravel-specialist/references/queues.md +423 -423
- package/skills/php/laravel-specialist/references/routing.md +362 -362
- package/skills/php/laravel-specialist/references/testing.md +522 -522
- package/skills/php/php-pro/SKILL.md +206 -206
- package/skills/php/php-pro/references/async-patterns.md +412 -412
- package/skills/php/php-pro/references/laravel-patterns.md +377 -377
- package/skills/php/php-pro/references/modern-php-features.md +323 -323
- package/skills/php/php-pro/references/symfony-patterns.md +466 -466
- package/skills/php/php-pro/references/testing-quality.md +466 -466
- package/skills/product/competitive-analysis/SKILL.md +257 -257
- package/skills/product/meeting-notes/SKILL.md +266 -266
- package/skills/product/prd-template/SKILL.md +150 -150
- package/skills/product/stakeholder-update/SKILL.md +225 -225
- package/skills/product/user-research-synthesis/SKILL.md +235 -235
- package/skills/python/django-expert/SKILL.md +162 -162
- package/skills/python/django-expert/references/authentication.md +145 -145
- package/skills/python/django-expert/references/drf-serializers.md +148 -148
- package/skills/python/django-expert/references/models-orm.md +151 -151
- package/skills/python/django-expert/references/testing-django.md +204 -204
- package/skills/python/django-expert/references/viewsets-views.md +153 -153
- package/skills/python/fastapi-expert/SKILL.md +185 -185
- package/skills/python/fastapi-expert/references/async-sqlalchemy.md +146 -146
- package/skills/python/fastapi-expert/references/authentication.md +159 -159
- package/skills/python/fastapi-expert/references/endpoints-routing.md +142 -142
- package/skills/python/fastapi-expert/references/migration-from-django.md +996 -996
- package/skills/python/fastapi-expert/references/pydantic-v2.md +135 -135
- package/skills/python/fastapi-expert/references/testing-async.md +159 -159
- package/skills/python/pandas-pro/SKILL.md +178 -178
- package/skills/python/pandas-pro/references/aggregation-groupby.md +545 -545
- package/skills/python/pandas-pro/references/data-cleaning.md +500 -500
- package/skills/python/pandas-pro/references/dataframe-operations.md +420 -420
- package/skills/python/pandas-pro/references/merging-joining.md +596 -596
- package/skills/python/pandas-pro/references/performance-optimization.md +597 -597
- package/skills/python/python-pro/SKILL.md +177 -177
- package/skills/python/python-pro/references/async-patterns.md +356 -356
- package/skills/python/python-pro/references/packaging.md +460 -460
- package/skills/python/python-pro/references/standard-library.md +378 -378
- package/skills/python/python-pro/references/testing.md +404 -404
- package/skills/python/python-pro/references/type-system.md +290 -290
- package/skills/quality/chaos-engineer/SKILL.md +182 -182
- package/skills/quality/chaos-engineer/references/chaos-tools.md +511 -511
- package/skills/quality/chaos-engineer/references/experiment-design.md +229 -229
- package/skills/quality/chaos-engineer/references/game-days.md +434 -434
- package/skills/quality/chaos-engineer/references/infrastructure-chaos.md +348 -348
- package/skills/quality/chaos-engineer/references/kubernetes-chaos.md +432 -432
- package/skills/quality/code-reviewer/SKILL.md +119 -119
- package/skills/quality/code-reviewer/references/common-issues.md +142 -142
- package/skills/quality/code-reviewer/references/feedback-examples.md +144 -144
- package/skills/quality/code-reviewer/references/receiving-feedback.md +238 -238
- package/skills/quality/code-reviewer/references/report-template.md +109 -109
- package/skills/quality/code-reviewer/references/review-checklist.md +88 -88
- package/skills/quality/code-reviewer/references/spec-compliance-review.md +258 -258
- package/skills/quality/playwright-expert/SKILL.md +169 -169
- package/skills/quality/playwright-expert/references/api-mocking.md +140 -140
- package/skills/quality/playwright-expert/references/configuration.md +155 -155
- package/skills/quality/playwright-expert/references/debugging-flaky.md +150 -150
- package/skills/quality/playwright-expert/references/page-object-model.md +152 -152
- package/skills/quality/playwright-expert/references/selectors-locators.md +119 -119
- package/skills/quality/secure-code-guardian/SKILL.md +191 -191
- package/skills/quality/secure-code-guardian/references/authentication.md +136 -136
- package/skills/quality/secure-code-guardian/references/input-validation.md +146 -146
- package/skills/quality/secure-code-guardian/references/owasp-prevention.md +135 -135
- package/skills/quality/secure-code-guardian/references/security-headers.md +133 -133
- package/skills/quality/secure-code-guardian/references/xss-csrf.md +157 -157
- package/skills/quality/security-reviewer/SKILL.md +103 -103
- package/skills/quality/security-reviewer/references/infrastructure-security.md +268 -268
- package/skills/quality/security-reviewer/references/penetration-testing.md +268 -268
- package/skills/quality/security-reviewer/references/report-template.md +170 -170
- package/skills/quality/security-reviewer/references/sast-tools.md +117 -117
- package/skills/quality/security-reviewer/references/secret-scanning.md +125 -125
- package/skills/quality/security-reviewer/references/vulnerability-patterns.md +152 -152
- package/skills/quality/senior-qa/README.md +196 -196
- package/skills/quality/senior-qa/SKILL.md +399 -399
- package/skills/quality/senior-qa/references/qa_best_practices.md +964 -964
- package/skills/quality/senior-qa/references/test_automation_patterns.md +1009 -1009
- package/skills/quality/senior-qa/references/testing_strategies.md +649 -649
- package/skills/quality/senior-qa/scripts/coverage_analyzer.py +836 -836
- package/skills/quality/senior-qa/scripts/e2e_test_scaffolder.py +820 -820
- package/skills/quality/senior-qa/scripts/test_suite_generator.py +605 -605
- package/skills/quality/tdd-guide/HOW_TO_USE.md +313 -313
- package/skills/quality/tdd-guide/README.md +680 -680
- package/skills/quality/tdd-guide/SKILL.md +122 -122
- package/skills/quality/tdd-guide/assets/expected_output.json +77 -77
- package/skills/quality/tdd-guide/assets/sample_input_python.json +39 -39
- package/skills/quality/tdd-guide/assets/sample_input_typescript.json +36 -36
- package/skills/quality/tdd-guide/references/ci-integration.md +195 -195
- package/skills/quality/tdd-guide/references/framework-guide.md +206 -206
- package/skills/quality/tdd-guide/references/tdd-best-practices.md +128 -128
- package/skills/quality/tdd-guide/scripts/coverage_analyzer.py +434 -434
- package/skills/quality/tdd-guide/scripts/fixture_generator.py +440 -440
- package/skills/quality/tdd-guide/scripts/format_detector.py +384 -384
- package/skills/quality/tdd-guide/scripts/framework_adapter.py +428 -428
- package/skills/quality/tdd-guide/scripts/metrics_calculator.py +456 -456
- package/skills/quality/tdd-guide/scripts/output_formatter.py +354 -354
- package/skills/quality/tdd-guide/scripts/tdd_workflow.py +474 -474
- package/skills/quality/tdd-guide/scripts/test_generator.py +438 -438
- package/skills/quality/test-master/SKILL.md +94 -94
- package/skills/quality/test-master/references/automation-frameworks.md +294 -294
- package/skills/quality/test-master/references/e2e-testing.md +128 -128
- package/skills/quality/test-master/references/integration-testing.md +120 -120
- package/skills/quality/test-master/references/performance-testing.md +118 -118
- package/skills/quality/test-master/references/qa-methodology.md +247 -247
- package/skills/quality/test-master/references/security-testing.md +127 -127
- package/skills/quality/test-master/references/tdd-iron-laws.md +174 -174
- package/skills/quality/test-master/references/test-reports.md +104 -104
- package/skills/quality/test-master/references/testing-anti-patterns.md +231 -231
- package/skills/quality/test-master/references/unit-testing.md +113 -113
- package/skills/ruby/rails-expert/SKILL.md +154 -154
- package/skills/ruby/rails-expert/references/active-record.md +244 -244
- package/skills/ruby/rails-expert/references/api-development.md +401 -401
- package/skills/ruby/rails-expert/references/background-jobs.md +272 -272
- package/skills/ruby/rails-expert/references/hotwire-turbo.md +228 -228
- package/skills/ruby/rails-expert/references/rspec-testing.md +367 -367
- package/skills/swift/swift-expert/SKILL.md +163 -163
- package/skills/swift/swift-expert/references/async-concurrency.md +360 -360
- package/skills/swift/swift-expert/references/memory-performance.md +377 -377
- package/skills/swift/swift-expert/references/protocol-oriented.md +354 -354
- package/skills/swift/swift-expert/references/swiftui-patterns.md +291 -291
- package/skills/swift/swift-expert/references/testing-patterns.md +399 -399
- package/skills/workflow/brainstorming/SKILL.md +164 -164
- package/skills/workflow/brainstorming/scripts/frame-template.html +214 -214
- package/skills/workflow/brainstorming/scripts/helper.js +88 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +354 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +148 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -56
- package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -49
- package/skills/workflow/brainstorming/visual-companion.md +287 -287
- package/skills/workflow/documentation/SKILL.md +45 -45
- package/skills/workflow/entropy-management/SKILL.md +115 -115
- package/skills/workflow/executing-plans/SKILL.md +70 -70
- package/skills/workflow/finishing-a-development-branch/SKILL.md +200 -200
- package/skills/workflow/receiving-code-review/SKILL.md +213 -213
- package/skills/workflow/requesting-code-review/SKILL.md +105 -105
- package/skills/workflow/requesting-code-review/code-reviewer.md +146 -146
- package/skills/workflow/requirement-engineering/SKILL.md +111 -111
- package/skills/workflow/systematic-debugging/CREATION-LOG.md +119 -119
- package/skills/workflow/systematic-debugging/SKILL.md +296 -296
- package/skills/workflow/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/skills/workflow/systematic-debugging/condition-based-waiting.md +115 -115
- package/skills/workflow/systematic-debugging/defense-in-depth.md +122 -122
- package/skills/workflow/systematic-debugging/find-polluter.sh +63 -63
- package/skills/workflow/systematic-debugging/root-cause-tracing.md +169 -169
- package/skills/workflow/systematic-debugging/test-academic.md +14 -14
- package/skills/workflow/systematic-debugging/test-pressure-1.md +58 -58
- package/skills/workflow/systematic-debugging/test-pressure-2.md +68 -68
- package/skills/workflow/systematic-debugging/test-pressure-3.md +69 -69
- package/skills/workflow/using-git-worktrees/SKILL.md +218 -218
- package/skills/workflow/verification-before-completion/SKILL.md +139 -139
- package/skills/workflow/writing-plans/SKILL.md +151 -151
- package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -49
- package/skills/workflow/writing-skills/SKILL.md +655 -655
- package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/skills/workflow/writing-skills/persuasion-principles.md +187 -187
- package/skills/workflow/writing-skills/render-graphs.js +168 -168
- package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -384
|
@@ -1,498 +1,498 @@
|
|
|
1
|
-
# Performance Optimization
|
|
2
|
-
|
|
3
|
-
## Span<T> and Memory<T>
|
|
4
|
-
|
|
5
|
-
```csharp
|
|
6
|
-
// Traditional string manipulation (allocates)
|
|
7
|
-
public string ProcessStringOld(string input)
|
|
8
|
-
{
|
|
9
|
-
return input.Substring(0, 10).ToUpper();
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// Using Span<T> (zero allocation)
|
|
13
|
-
public string ProcessStringNew(ReadOnlySpan<char> input)
|
|
14
|
-
{
|
|
15
|
-
Span<char> buffer = stackalloc char[10];
|
|
16
|
-
input[..10].ToUpperInvariant(buffer);
|
|
17
|
-
return new string(buffer);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Parsing with Span<T>
|
|
21
|
-
public int ParseNumber(ReadOnlySpan<char> text)
|
|
22
|
-
{
|
|
23
|
-
return int.Parse(text);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Stack allocation for small arrays
|
|
27
|
-
public void ProcessSmallArray()
|
|
28
|
-
{
|
|
29
|
-
Span<int> numbers = stackalloc int[10];
|
|
30
|
-
for (int i = 0; i < numbers.Length; i++)
|
|
31
|
-
{
|
|
32
|
-
numbers[i] = i * 2;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Working with byte data
|
|
37
|
-
public void ProcessBytes(ReadOnlySpan<byte> data)
|
|
38
|
-
{
|
|
39
|
-
// Direct memory access, no allocations
|
|
40
|
-
for (int i = 0; i < data.Length; i++)
|
|
41
|
-
{
|
|
42
|
-
var byte = data[i];
|
|
43
|
-
// Process byte
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## ArrayPool for Buffer Reuse
|
|
49
|
-
|
|
50
|
-
```csharp
|
|
51
|
-
using System.Buffers;
|
|
52
|
-
|
|
53
|
-
public class BufferProcessor
|
|
54
|
-
{
|
|
55
|
-
public async Task ProcessLargeDataAsync(Stream stream, CancellationToken ct)
|
|
56
|
-
{
|
|
57
|
-
// Rent array from pool
|
|
58
|
-
var buffer = ArrayPool<byte>.Shared.Rent(4096);
|
|
59
|
-
|
|
60
|
-
try
|
|
61
|
-
{
|
|
62
|
-
int bytesRead;
|
|
63
|
-
while ((bytesRead = await stream.ReadAsync(buffer, ct)) > 0)
|
|
64
|
-
{
|
|
65
|
-
// Process buffer[0..bytesRead]
|
|
66
|
-
ProcessChunk(buffer.AsSpan(0, bytesRead));
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
finally
|
|
70
|
-
{
|
|
71
|
-
// Always return to pool
|
|
72
|
-
ArrayPool<byte>.Shared.Return(buffer);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
private void ProcessChunk(ReadOnlySpan<byte> chunk)
|
|
77
|
-
{
|
|
78
|
-
// Processing logic
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Async Best Practices
|
|
84
|
-
|
|
85
|
-
```csharp
|
|
86
|
-
// Use ValueTask for frequently synchronous paths
|
|
87
|
-
public class CacheService
|
|
88
|
-
{
|
|
89
|
-
private readonly Dictionary<string, string> _cache = new();
|
|
90
|
-
|
|
91
|
-
public ValueTask<string?> GetAsync(string key)
|
|
92
|
-
{
|
|
93
|
-
// If cached, return synchronously without allocation
|
|
94
|
-
if (_cache.TryGetValue(key, out var value))
|
|
95
|
-
return ValueTask.FromResult<string?>(value);
|
|
96
|
-
|
|
97
|
-
// Otherwise, async path
|
|
98
|
-
return LoadFromDatabaseAsync(key);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
private async ValueTask<string?> LoadFromDatabaseAsync(string key)
|
|
102
|
-
{
|
|
103
|
-
var value = await _database.GetAsync(key);
|
|
104
|
-
_cache[key] = value;
|
|
105
|
-
return value;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// ConfigureAwait(false) in libraries
|
|
110
|
-
public async Task<Data> GetDataAsync()
|
|
111
|
-
{
|
|
112
|
-
var response = await _httpClient.GetAsync("api/data")
|
|
113
|
-
.ConfigureAwait(false);
|
|
114
|
-
return await response.Content.ReadFromJsonAsync<Data>()
|
|
115
|
-
.ConfigureAwait(false);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Avoid async void except for event handlers
|
|
119
|
-
public async void ButtonClick(object sender, EventArgs e) // OK for events
|
|
120
|
-
{
|
|
121
|
-
try
|
|
122
|
-
{
|
|
123
|
-
await ProcessClickAsync();
|
|
124
|
-
}
|
|
125
|
-
catch (Exception ex)
|
|
126
|
-
{
|
|
127
|
-
_logger.LogError(ex, "Error processing click");
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Cancellation token support
|
|
132
|
-
public async Task<List<Product>> GetProductsAsync(CancellationToken ct = default)
|
|
133
|
-
{
|
|
134
|
-
return await _dbContext.Products
|
|
135
|
-
.AsNoTracking()
|
|
136
|
-
.ToListAsync(ct);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Parallel async operations
|
|
140
|
-
public async Task<(User user, Orders orders, Profile profile)> GetUserDataAsync(int userId)
|
|
141
|
-
{
|
|
142
|
-
var userTask = _userService.GetAsync(userId);
|
|
143
|
-
var ordersTask = _orderService.GetByUserAsync(userId);
|
|
144
|
-
var profileTask = _profileService.GetAsync(userId);
|
|
145
|
-
|
|
146
|
-
await Task.WhenAll(userTask, ordersTask, profileTask);
|
|
147
|
-
|
|
148
|
-
return (await userTask, await ordersTask, await profileTask);
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
## Object Pooling
|
|
153
|
-
|
|
154
|
-
```csharp
|
|
155
|
-
using Microsoft.Extensions.ObjectPool;
|
|
156
|
-
|
|
157
|
-
// Define pooled object policy
|
|
158
|
-
public class StringBuilderPooledObjectPolicy : PooledObjectPolicy<StringBuilder>
|
|
159
|
-
{
|
|
160
|
-
public override StringBuilder Create() => new StringBuilder();
|
|
161
|
-
|
|
162
|
-
public override bool Return(StringBuilder obj)
|
|
163
|
-
{
|
|
164
|
-
obj.Clear();
|
|
165
|
-
return obj.Capacity <= 4096; // Don't pool if too large
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Register in DI
|
|
170
|
-
builder.Services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
|
|
171
|
-
builder.Services.AddSingleton(serviceProvider =>
|
|
172
|
-
{
|
|
173
|
-
var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();
|
|
174
|
-
return provider.Create(new StringBuilderPooledObjectPolicy());
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
// Usage
|
|
178
|
-
public class MessageFormatter(ObjectPool<StringBuilder> pool)
|
|
179
|
-
{
|
|
180
|
-
public string FormatMessage(string template, params object[] args)
|
|
181
|
-
{
|
|
182
|
-
var builder = pool.Get();
|
|
183
|
-
try
|
|
184
|
-
{
|
|
185
|
-
builder.AppendFormat(template, args);
|
|
186
|
-
return builder.ToString();
|
|
187
|
-
}
|
|
188
|
-
finally
|
|
189
|
-
{
|
|
190
|
-
pool.Return(builder);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
## Benchmarking with BenchmarkDotNet
|
|
197
|
-
|
|
198
|
-
```csharp
|
|
199
|
-
using BenchmarkDotNet.Attributes;
|
|
200
|
-
using BenchmarkDotNet.Running;
|
|
201
|
-
|
|
202
|
-
[MemoryDiagnoser]
|
|
203
|
-
[SimpleJob(warmupCount: 3, iterationCount: 5)]
|
|
204
|
-
public class StringBenchmarks
|
|
205
|
-
{
|
|
206
|
-
private const string Input = "Hello, World!";
|
|
207
|
-
|
|
208
|
-
[Benchmark(Baseline = true)]
|
|
209
|
-
public string UsingSubstring()
|
|
210
|
-
{
|
|
211
|
-
return Input.Substring(0, 5).ToUpper();
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
[Benchmark]
|
|
215
|
-
public string UsingSpan()
|
|
216
|
-
{
|
|
217
|
-
ReadOnlySpan<char> span = Input.AsSpan(0, 5);
|
|
218
|
-
return span.ToString().ToUpper();
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
[Benchmark]
|
|
222
|
-
public string UsingSpanWithStackAlloc()
|
|
223
|
-
{
|
|
224
|
-
ReadOnlySpan<char> input = Input;
|
|
225
|
-
Span<char> buffer = stackalloc char[5];
|
|
226
|
-
input[..5].ToUpperInvariant(buffer);
|
|
227
|
-
return new string(buffer);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Program.cs
|
|
232
|
-
class Program
|
|
233
|
-
{
|
|
234
|
-
static void Main(string[] args)
|
|
235
|
-
{
|
|
236
|
-
var summary = BenchmarkRunner.Run<StringBenchmarks>();
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
## Collection Performance
|
|
242
|
-
|
|
243
|
-
```csharp
|
|
244
|
-
// Use appropriate collection types
|
|
245
|
-
public class CollectionExamples
|
|
246
|
-
{
|
|
247
|
-
// Fast lookups: Dictionary over List
|
|
248
|
-
private readonly Dictionary<int, Product> _productsById = new();
|
|
249
|
-
|
|
250
|
-
// HashSet for unique items
|
|
251
|
-
private readonly HashSet<string> _processedIds = new();
|
|
252
|
-
|
|
253
|
-
// Frozen collections for readonly data (.NET 8)
|
|
254
|
-
private static readonly FrozenDictionary<string, int> StatusCodes =
|
|
255
|
-
new Dictionary<string, int>
|
|
256
|
-
{
|
|
257
|
-
["Active"] = 1,
|
|
258
|
-
["Inactive"] = 0
|
|
259
|
-
}.ToFrozenDictionary();
|
|
260
|
-
|
|
261
|
-
// Pre-size collections when count is known
|
|
262
|
-
public List<Product> CreateProducts(int count)
|
|
263
|
-
{
|
|
264
|
-
var products = new List<Product>(count); // Pre-allocate
|
|
265
|
-
for (int i = 0; i < count; i++)
|
|
266
|
-
{
|
|
267
|
-
products.Add(new Product { Id = i });
|
|
268
|
-
}
|
|
269
|
-
return products;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Use spans for array operations
|
|
273
|
-
public int SumArray(int[] numbers)
|
|
274
|
-
{
|
|
275
|
-
return Sum(numbers.AsSpan());
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
private static int Sum(ReadOnlySpan<int> numbers)
|
|
279
|
-
{
|
|
280
|
-
int total = 0;
|
|
281
|
-
foreach (var n in numbers)
|
|
282
|
-
total += n;
|
|
283
|
-
return total;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
## LINQ Optimization
|
|
289
|
-
|
|
290
|
-
```csharp
|
|
291
|
-
public class LinqOptimizations
|
|
292
|
-
{
|
|
293
|
-
// Avoid multiple enumerations
|
|
294
|
-
public void BadExample(IEnumerable<int> numbers)
|
|
295
|
-
{
|
|
296
|
-
if (numbers.Any())
|
|
297
|
-
{
|
|
298
|
-
var first = numbers.First(); // Enumerates again
|
|
299
|
-
var count = numbers.Count(); // Enumerates again
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
public void GoodExample(IEnumerable<int> numbers)
|
|
304
|
-
{
|
|
305
|
-
var list = numbers.ToList(); // Enumerate once
|
|
306
|
-
if (list.Count > 0)
|
|
307
|
-
{
|
|
308
|
-
var first = list[0];
|
|
309
|
-
var count = list.Count;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// Use appropriate LINQ methods
|
|
314
|
-
public bool HasActiveUsers(List<User> users)
|
|
315
|
-
{
|
|
316
|
-
return users.Any(u => u.IsActive); // Better than Count() > 0
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Avoid unnecessary ToList()
|
|
320
|
-
public IEnumerable<Product> GetExpensiveProducts(IEnumerable<Product> products)
|
|
321
|
-
{
|
|
322
|
-
return products.Where(p => p.Price > 100); // Deferred execution
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// Use Select for projections early
|
|
326
|
-
public List<string> GetProductNames(IEnumerable<Product> products)
|
|
327
|
-
{
|
|
328
|
-
return products
|
|
329
|
-
.Where(p => p.IsActive)
|
|
330
|
-
.Select(p => p.Name) // Project early
|
|
331
|
-
.ToList();
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
## Response Caching and Compression
|
|
337
|
-
|
|
338
|
-
```csharp
|
|
339
|
-
// Program.cs
|
|
340
|
-
builder.Services.AddResponseCaching();
|
|
341
|
-
builder.Services.AddResponseCompression(options =>
|
|
342
|
-
{
|
|
343
|
-
options.EnableForHttps = true;
|
|
344
|
-
options.Providers.Add<BrotliCompressionProvider>();
|
|
345
|
-
options.Providers.Add<GzipCompressionProvider>();
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
app.UseResponseCompression();
|
|
349
|
-
app.UseResponseCaching();
|
|
350
|
-
|
|
351
|
-
// Endpoint with caching
|
|
352
|
-
app.MapGet("/api/products", async (ProductService service) =>
|
|
353
|
-
{
|
|
354
|
-
var products = await service.GetAllAsync();
|
|
355
|
-
return Results.Ok(products);
|
|
356
|
-
})
|
|
357
|
-
.CacheOutput(policy => policy.Expire(TimeSpan.FromMinutes(5)));
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
## Database Query Optimization
|
|
361
|
-
|
|
362
|
-
```csharp
|
|
363
|
-
public class OptimizedQueries(AppDbContext context)
|
|
364
|
-
{
|
|
365
|
-
// Use AsNoTracking for read-only queries
|
|
366
|
-
public async Task<List<ProductDto>> GetProductsAsync(CancellationToken ct)
|
|
367
|
-
{
|
|
368
|
-
return await context.Products
|
|
369
|
-
.AsNoTracking()
|
|
370
|
-
.Select(p => new ProductDto
|
|
371
|
-
{
|
|
372
|
-
Id = p.Id,
|
|
373
|
-
Name = p.Name,
|
|
374
|
-
Price = p.Price
|
|
375
|
-
})
|
|
376
|
-
.ToListAsync(ct);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
// Avoid N+1 queries with Include
|
|
380
|
-
public async Task<List<Order>> GetOrdersWithItemsAsync(CancellationToken ct)
|
|
381
|
-
{
|
|
382
|
-
return await context.Orders
|
|
383
|
-
.Include(o => o.OrderItems)
|
|
384
|
-
.ThenInclude(oi => oi.Product)
|
|
385
|
-
.AsNoTracking()
|
|
386
|
-
.ToListAsync(ct);
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
// Use compiled queries for repeated queries
|
|
390
|
-
private static readonly Func<AppDbContext, int, Task<Product?>> GetProductById =
|
|
391
|
-
EF.CompileAsyncQuery((AppDbContext ctx, int id) =>
|
|
392
|
-
ctx.Products.FirstOrDefault(p => p.Id == id));
|
|
393
|
-
|
|
394
|
-
public Task<Product?> GetProductOptimizedAsync(int id)
|
|
395
|
-
{
|
|
396
|
-
return GetProductById(context, id);
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// Pagination
|
|
400
|
-
public async Task<PagedResult<ProductDto>> GetPagedAsync(
|
|
401
|
-
int page,
|
|
402
|
-
int pageSize,
|
|
403
|
-
CancellationToken ct)
|
|
404
|
-
{
|
|
405
|
-
var query = context.Products.AsNoTracking();
|
|
406
|
-
|
|
407
|
-
var total = await query.CountAsync(ct);
|
|
408
|
-
|
|
409
|
-
var items = await query
|
|
410
|
-
.OrderBy(p => p.Name)
|
|
411
|
-
.Skip((page - 1) * pageSize)
|
|
412
|
-
.Take(pageSize)
|
|
413
|
-
.Select(p => new ProductDto
|
|
414
|
-
{
|
|
415
|
-
Id = p.Id,
|
|
416
|
-
Name = p.Name,
|
|
417
|
-
Price = p.Price
|
|
418
|
-
})
|
|
419
|
-
.ToListAsync(ct);
|
|
420
|
-
|
|
421
|
-
return new PagedResult<ProductDto>(items, total, page, pageSize);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
## Source Generators and AOT
|
|
427
|
-
|
|
428
|
-
```csharp
|
|
429
|
-
// Prepare for Native AOT
|
|
430
|
-
using System.Text.Json.Serialization;
|
|
431
|
-
|
|
432
|
-
[JsonSerializable(typeof(ProductDto))]
|
|
433
|
-
[JsonSerializable(typeof(List<ProductDto>))]
|
|
434
|
-
internal partial class AppJsonSerializerContext : JsonSerializerContext
|
|
435
|
-
{
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
// Usage in API
|
|
439
|
-
app.MapGet("/api/products", async (ProductService service) =>
|
|
440
|
-
{
|
|
441
|
-
var products = await service.GetAllAsync();
|
|
442
|
-
return Results.Json(products, AppJsonSerializerContext.Default.ListProductDto);
|
|
443
|
-
});
|
|
444
|
-
|
|
445
|
-
// .csproj for AOT
|
|
446
|
-
<PropertyGroup>
|
|
447
|
-
<PublishAot>true</PublishAot>
|
|
448
|
-
<InvariantGlobalization>true</InvariantGlobalization>
|
|
449
|
-
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>
|
|
450
|
-
</PropertyGroup>
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
## Memory Profiling Tips
|
|
454
|
-
|
|
455
|
-
```csharp
|
|
456
|
-
// Avoid boxing value types
|
|
457
|
-
public void AvoidBoxing()
|
|
458
|
-
{
|
|
459
|
-
// Bad: boxing
|
|
460
|
-
object obj = 42;
|
|
461
|
-
|
|
462
|
-
// Good: use generics
|
|
463
|
-
void Print<T>(T value) => Console.WriteLine(value);
|
|
464
|
-
Print(42); // No boxing
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
// Use structs for small, immutable data
|
|
468
|
-
public readonly struct Point(int x, int y)
|
|
469
|
-
{
|
|
470
|
-
public int X { get; } = x;
|
|
471
|
-
public int Y { get; } = y;
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
// Avoid string concatenation in loops
|
|
475
|
-
public string BuildString(List<string> items)
|
|
476
|
-
{
|
|
477
|
-
var builder = new StringBuilder();
|
|
478
|
-
foreach (var item in items)
|
|
479
|
-
{
|
|
480
|
-
builder.Append(item);
|
|
481
|
-
}
|
|
482
|
-
return builder.ToString();
|
|
483
|
-
}
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
## Quick Reference
|
|
487
|
-
|
|
488
|
-
| Optimization | Use Case | Benefit |
|
|
489
|
-
|-------------|----------|---------|
|
|
490
|
-
| `Span<T>` | Array/string operations | Zero allocation |
|
|
491
|
-
| `ArrayPool<T>` | Temporary buffers | Reduce GC pressure |
|
|
492
|
-
| `ValueTask<T>` | Frequently sync paths | Lower allocation |
|
|
493
|
-
| `ConfigureAwait(false)` | Libraries | Avoid context capture |
|
|
494
|
-
| Frozen collections | Static readonly data | Faster lookups |
|
|
495
|
-
| `AsNoTracking()` | Read-only queries | Better EF performance |
|
|
496
|
-
| Object pooling | Heavy objects | Reuse instances |
|
|
497
|
-
| Response caching | Static responses | Reduce server load |
|
|
498
|
-
| Native AOT | Startup time critical | Faster cold start |
|
|
1
|
+
# Performance Optimization
|
|
2
|
+
|
|
3
|
+
## Span<T> and Memory<T>
|
|
4
|
+
|
|
5
|
+
```csharp
|
|
6
|
+
// Traditional string manipulation (allocates)
|
|
7
|
+
public string ProcessStringOld(string input)
|
|
8
|
+
{
|
|
9
|
+
return input.Substring(0, 10).ToUpper();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Using Span<T> (zero allocation)
|
|
13
|
+
public string ProcessStringNew(ReadOnlySpan<char> input)
|
|
14
|
+
{
|
|
15
|
+
Span<char> buffer = stackalloc char[10];
|
|
16
|
+
input[..10].ToUpperInvariant(buffer);
|
|
17
|
+
return new string(buffer);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Parsing with Span<T>
|
|
21
|
+
public int ParseNumber(ReadOnlySpan<char> text)
|
|
22
|
+
{
|
|
23
|
+
return int.Parse(text);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Stack allocation for small arrays
|
|
27
|
+
public void ProcessSmallArray()
|
|
28
|
+
{
|
|
29
|
+
Span<int> numbers = stackalloc int[10];
|
|
30
|
+
for (int i = 0; i < numbers.Length; i++)
|
|
31
|
+
{
|
|
32
|
+
numbers[i] = i * 2;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Working with byte data
|
|
37
|
+
public void ProcessBytes(ReadOnlySpan<byte> data)
|
|
38
|
+
{
|
|
39
|
+
// Direct memory access, no allocations
|
|
40
|
+
for (int i = 0; i < data.Length; i++)
|
|
41
|
+
{
|
|
42
|
+
var byte = data[i];
|
|
43
|
+
// Process byte
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## ArrayPool for Buffer Reuse
|
|
49
|
+
|
|
50
|
+
```csharp
|
|
51
|
+
using System.Buffers;
|
|
52
|
+
|
|
53
|
+
public class BufferProcessor
|
|
54
|
+
{
|
|
55
|
+
public async Task ProcessLargeDataAsync(Stream stream, CancellationToken ct)
|
|
56
|
+
{
|
|
57
|
+
// Rent array from pool
|
|
58
|
+
var buffer = ArrayPool<byte>.Shared.Rent(4096);
|
|
59
|
+
|
|
60
|
+
try
|
|
61
|
+
{
|
|
62
|
+
int bytesRead;
|
|
63
|
+
while ((bytesRead = await stream.ReadAsync(buffer, ct)) > 0)
|
|
64
|
+
{
|
|
65
|
+
// Process buffer[0..bytesRead]
|
|
66
|
+
ProcessChunk(buffer.AsSpan(0, bytesRead));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
finally
|
|
70
|
+
{
|
|
71
|
+
// Always return to pool
|
|
72
|
+
ArrayPool<byte>.Shared.Return(buffer);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
private void ProcessChunk(ReadOnlySpan<byte> chunk)
|
|
77
|
+
{
|
|
78
|
+
// Processing logic
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Async Best Practices
|
|
84
|
+
|
|
85
|
+
```csharp
|
|
86
|
+
// Use ValueTask for frequently synchronous paths
|
|
87
|
+
public class CacheService
|
|
88
|
+
{
|
|
89
|
+
private readonly Dictionary<string, string> _cache = new();
|
|
90
|
+
|
|
91
|
+
public ValueTask<string?> GetAsync(string key)
|
|
92
|
+
{
|
|
93
|
+
// If cached, return synchronously without allocation
|
|
94
|
+
if (_cache.TryGetValue(key, out var value))
|
|
95
|
+
return ValueTask.FromResult<string?>(value);
|
|
96
|
+
|
|
97
|
+
// Otherwise, async path
|
|
98
|
+
return LoadFromDatabaseAsync(key);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private async ValueTask<string?> LoadFromDatabaseAsync(string key)
|
|
102
|
+
{
|
|
103
|
+
var value = await _database.GetAsync(key);
|
|
104
|
+
_cache[key] = value;
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ConfigureAwait(false) in libraries
|
|
110
|
+
public async Task<Data> GetDataAsync()
|
|
111
|
+
{
|
|
112
|
+
var response = await _httpClient.GetAsync("api/data")
|
|
113
|
+
.ConfigureAwait(false);
|
|
114
|
+
return await response.Content.ReadFromJsonAsync<Data>()
|
|
115
|
+
.ConfigureAwait(false);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Avoid async void except for event handlers
|
|
119
|
+
public async void ButtonClick(object sender, EventArgs e) // OK for events
|
|
120
|
+
{
|
|
121
|
+
try
|
|
122
|
+
{
|
|
123
|
+
await ProcessClickAsync();
|
|
124
|
+
}
|
|
125
|
+
catch (Exception ex)
|
|
126
|
+
{
|
|
127
|
+
_logger.LogError(ex, "Error processing click");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Cancellation token support
|
|
132
|
+
public async Task<List<Product>> GetProductsAsync(CancellationToken ct = default)
|
|
133
|
+
{
|
|
134
|
+
return await _dbContext.Products
|
|
135
|
+
.AsNoTracking()
|
|
136
|
+
.ToListAsync(ct);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Parallel async operations
|
|
140
|
+
public async Task<(User user, Orders orders, Profile profile)> GetUserDataAsync(int userId)
|
|
141
|
+
{
|
|
142
|
+
var userTask = _userService.GetAsync(userId);
|
|
143
|
+
var ordersTask = _orderService.GetByUserAsync(userId);
|
|
144
|
+
var profileTask = _profileService.GetAsync(userId);
|
|
145
|
+
|
|
146
|
+
await Task.WhenAll(userTask, ordersTask, profileTask);
|
|
147
|
+
|
|
148
|
+
return (await userTask, await ordersTask, await profileTask);
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Object Pooling
|
|
153
|
+
|
|
154
|
+
```csharp
|
|
155
|
+
using Microsoft.Extensions.ObjectPool;
|
|
156
|
+
|
|
157
|
+
// Define pooled object policy
|
|
158
|
+
public class StringBuilderPooledObjectPolicy : PooledObjectPolicy<StringBuilder>
|
|
159
|
+
{
|
|
160
|
+
public override StringBuilder Create() => new StringBuilder();
|
|
161
|
+
|
|
162
|
+
public override bool Return(StringBuilder obj)
|
|
163
|
+
{
|
|
164
|
+
obj.Clear();
|
|
165
|
+
return obj.Capacity <= 4096; // Don't pool if too large
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Register in DI
|
|
170
|
+
builder.Services.AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
|
|
171
|
+
builder.Services.AddSingleton(serviceProvider =>
|
|
172
|
+
{
|
|
173
|
+
var provider = serviceProvider.GetRequiredService<ObjectPoolProvider>();
|
|
174
|
+
return provider.Create(new StringBuilderPooledObjectPolicy());
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// Usage
|
|
178
|
+
public class MessageFormatter(ObjectPool<StringBuilder> pool)
|
|
179
|
+
{
|
|
180
|
+
public string FormatMessage(string template, params object[] args)
|
|
181
|
+
{
|
|
182
|
+
var builder = pool.Get();
|
|
183
|
+
try
|
|
184
|
+
{
|
|
185
|
+
builder.AppendFormat(template, args);
|
|
186
|
+
return builder.ToString();
|
|
187
|
+
}
|
|
188
|
+
finally
|
|
189
|
+
{
|
|
190
|
+
pool.Return(builder);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Benchmarking with BenchmarkDotNet
|
|
197
|
+
|
|
198
|
+
```csharp
|
|
199
|
+
using BenchmarkDotNet.Attributes;
|
|
200
|
+
using BenchmarkDotNet.Running;
|
|
201
|
+
|
|
202
|
+
[MemoryDiagnoser]
|
|
203
|
+
[SimpleJob(warmupCount: 3, iterationCount: 5)]
|
|
204
|
+
public class StringBenchmarks
|
|
205
|
+
{
|
|
206
|
+
private const string Input = "Hello, World!";
|
|
207
|
+
|
|
208
|
+
[Benchmark(Baseline = true)]
|
|
209
|
+
public string UsingSubstring()
|
|
210
|
+
{
|
|
211
|
+
return Input.Substring(0, 5).ToUpper();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
[Benchmark]
|
|
215
|
+
public string UsingSpan()
|
|
216
|
+
{
|
|
217
|
+
ReadOnlySpan<char> span = Input.AsSpan(0, 5);
|
|
218
|
+
return span.ToString().ToUpper();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
[Benchmark]
|
|
222
|
+
public string UsingSpanWithStackAlloc()
|
|
223
|
+
{
|
|
224
|
+
ReadOnlySpan<char> input = Input;
|
|
225
|
+
Span<char> buffer = stackalloc char[5];
|
|
226
|
+
input[..5].ToUpperInvariant(buffer);
|
|
227
|
+
return new string(buffer);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Program.cs
|
|
232
|
+
class Program
|
|
233
|
+
{
|
|
234
|
+
static void Main(string[] args)
|
|
235
|
+
{
|
|
236
|
+
var summary = BenchmarkRunner.Run<StringBenchmarks>();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## Collection Performance
|
|
242
|
+
|
|
243
|
+
```csharp
|
|
244
|
+
// Use appropriate collection types
|
|
245
|
+
public class CollectionExamples
|
|
246
|
+
{
|
|
247
|
+
// Fast lookups: Dictionary over List
|
|
248
|
+
private readonly Dictionary<int, Product> _productsById = new();
|
|
249
|
+
|
|
250
|
+
// HashSet for unique items
|
|
251
|
+
private readonly HashSet<string> _processedIds = new();
|
|
252
|
+
|
|
253
|
+
// Frozen collections for readonly data (.NET 8)
|
|
254
|
+
private static readonly FrozenDictionary<string, int> StatusCodes =
|
|
255
|
+
new Dictionary<string, int>
|
|
256
|
+
{
|
|
257
|
+
["Active"] = 1,
|
|
258
|
+
["Inactive"] = 0
|
|
259
|
+
}.ToFrozenDictionary();
|
|
260
|
+
|
|
261
|
+
// Pre-size collections when count is known
|
|
262
|
+
public List<Product> CreateProducts(int count)
|
|
263
|
+
{
|
|
264
|
+
var products = new List<Product>(count); // Pre-allocate
|
|
265
|
+
for (int i = 0; i < count; i++)
|
|
266
|
+
{
|
|
267
|
+
products.Add(new Product { Id = i });
|
|
268
|
+
}
|
|
269
|
+
return products;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Use spans for array operations
|
|
273
|
+
public int SumArray(int[] numbers)
|
|
274
|
+
{
|
|
275
|
+
return Sum(numbers.AsSpan());
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
private static int Sum(ReadOnlySpan<int> numbers)
|
|
279
|
+
{
|
|
280
|
+
int total = 0;
|
|
281
|
+
foreach (var n in numbers)
|
|
282
|
+
total += n;
|
|
283
|
+
return total;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## LINQ Optimization
|
|
289
|
+
|
|
290
|
+
```csharp
|
|
291
|
+
public class LinqOptimizations
|
|
292
|
+
{
|
|
293
|
+
// Avoid multiple enumerations
|
|
294
|
+
public void BadExample(IEnumerable<int> numbers)
|
|
295
|
+
{
|
|
296
|
+
if (numbers.Any())
|
|
297
|
+
{
|
|
298
|
+
var first = numbers.First(); // Enumerates again
|
|
299
|
+
var count = numbers.Count(); // Enumerates again
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
public void GoodExample(IEnumerable<int> numbers)
|
|
304
|
+
{
|
|
305
|
+
var list = numbers.ToList(); // Enumerate once
|
|
306
|
+
if (list.Count > 0)
|
|
307
|
+
{
|
|
308
|
+
var first = list[0];
|
|
309
|
+
var count = list.Count;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Use appropriate LINQ methods
|
|
314
|
+
public bool HasActiveUsers(List<User> users)
|
|
315
|
+
{
|
|
316
|
+
return users.Any(u => u.IsActive); // Better than Count() > 0
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Avoid unnecessary ToList()
|
|
320
|
+
public IEnumerable<Product> GetExpensiveProducts(IEnumerable<Product> products)
|
|
321
|
+
{
|
|
322
|
+
return products.Where(p => p.Price > 100); // Deferred execution
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Use Select for projections early
|
|
326
|
+
public List<string> GetProductNames(IEnumerable<Product> products)
|
|
327
|
+
{
|
|
328
|
+
return products
|
|
329
|
+
.Where(p => p.IsActive)
|
|
330
|
+
.Select(p => p.Name) // Project early
|
|
331
|
+
.ToList();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
## Response Caching and Compression
|
|
337
|
+
|
|
338
|
+
```csharp
|
|
339
|
+
// Program.cs
|
|
340
|
+
builder.Services.AddResponseCaching();
|
|
341
|
+
builder.Services.AddResponseCompression(options =>
|
|
342
|
+
{
|
|
343
|
+
options.EnableForHttps = true;
|
|
344
|
+
options.Providers.Add<BrotliCompressionProvider>();
|
|
345
|
+
options.Providers.Add<GzipCompressionProvider>();
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
app.UseResponseCompression();
|
|
349
|
+
app.UseResponseCaching();
|
|
350
|
+
|
|
351
|
+
// Endpoint with caching
|
|
352
|
+
app.MapGet("/api/products", async (ProductService service) =>
|
|
353
|
+
{
|
|
354
|
+
var products = await service.GetAllAsync();
|
|
355
|
+
return Results.Ok(products);
|
|
356
|
+
})
|
|
357
|
+
.CacheOutput(policy => policy.Expire(TimeSpan.FromMinutes(5)));
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
## Database Query Optimization
|
|
361
|
+
|
|
362
|
+
```csharp
|
|
363
|
+
public class OptimizedQueries(AppDbContext context)
|
|
364
|
+
{
|
|
365
|
+
// Use AsNoTracking for read-only queries
|
|
366
|
+
public async Task<List<ProductDto>> GetProductsAsync(CancellationToken ct)
|
|
367
|
+
{
|
|
368
|
+
return await context.Products
|
|
369
|
+
.AsNoTracking()
|
|
370
|
+
.Select(p => new ProductDto
|
|
371
|
+
{
|
|
372
|
+
Id = p.Id,
|
|
373
|
+
Name = p.Name,
|
|
374
|
+
Price = p.Price
|
|
375
|
+
})
|
|
376
|
+
.ToListAsync(ct);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Avoid N+1 queries with Include
|
|
380
|
+
public async Task<List<Order>> GetOrdersWithItemsAsync(CancellationToken ct)
|
|
381
|
+
{
|
|
382
|
+
return await context.Orders
|
|
383
|
+
.Include(o => o.OrderItems)
|
|
384
|
+
.ThenInclude(oi => oi.Product)
|
|
385
|
+
.AsNoTracking()
|
|
386
|
+
.ToListAsync(ct);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Use compiled queries for repeated queries
|
|
390
|
+
private static readonly Func<AppDbContext, int, Task<Product?>> GetProductById =
|
|
391
|
+
EF.CompileAsyncQuery((AppDbContext ctx, int id) =>
|
|
392
|
+
ctx.Products.FirstOrDefault(p => p.Id == id));
|
|
393
|
+
|
|
394
|
+
public Task<Product?> GetProductOptimizedAsync(int id)
|
|
395
|
+
{
|
|
396
|
+
return GetProductById(context, id);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
// Pagination
|
|
400
|
+
public async Task<PagedResult<ProductDto>> GetPagedAsync(
|
|
401
|
+
int page,
|
|
402
|
+
int pageSize,
|
|
403
|
+
CancellationToken ct)
|
|
404
|
+
{
|
|
405
|
+
var query = context.Products.AsNoTracking();
|
|
406
|
+
|
|
407
|
+
var total = await query.CountAsync(ct);
|
|
408
|
+
|
|
409
|
+
var items = await query
|
|
410
|
+
.OrderBy(p => p.Name)
|
|
411
|
+
.Skip((page - 1) * pageSize)
|
|
412
|
+
.Take(pageSize)
|
|
413
|
+
.Select(p => new ProductDto
|
|
414
|
+
{
|
|
415
|
+
Id = p.Id,
|
|
416
|
+
Name = p.Name,
|
|
417
|
+
Price = p.Price
|
|
418
|
+
})
|
|
419
|
+
.ToListAsync(ct);
|
|
420
|
+
|
|
421
|
+
return new PagedResult<ProductDto>(items, total, page, pageSize);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
## Source Generators and AOT
|
|
427
|
+
|
|
428
|
+
```csharp
|
|
429
|
+
// Prepare for Native AOT
|
|
430
|
+
using System.Text.Json.Serialization;
|
|
431
|
+
|
|
432
|
+
[JsonSerializable(typeof(ProductDto))]
|
|
433
|
+
[JsonSerializable(typeof(List<ProductDto>))]
|
|
434
|
+
internal partial class AppJsonSerializerContext : JsonSerializerContext
|
|
435
|
+
{
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Usage in API
|
|
439
|
+
app.MapGet("/api/products", async (ProductService service) =>
|
|
440
|
+
{
|
|
441
|
+
var products = await service.GetAllAsync();
|
|
442
|
+
return Results.Json(products, AppJsonSerializerContext.Default.ListProductDto);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
// .csproj for AOT
|
|
446
|
+
<PropertyGroup>
|
|
447
|
+
<PublishAot>true</PublishAot>
|
|
448
|
+
<InvariantGlobalization>true</InvariantGlobalization>
|
|
449
|
+
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>
|
|
450
|
+
</PropertyGroup>
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
## Memory Profiling Tips
|
|
454
|
+
|
|
455
|
+
```csharp
|
|
456
|
+
// Avoid boxing value types
|
|
457
|
+
public void AvoidBoxing()
|
|
458
|
+
{
|
|
459
|
+
// Bad: boxing
|
|
460
|
+
object obj = 42;
|
|
461
|
+
|
|
462
|
+
// Good: use generics
|
|
463
|
+
void Print<T>(T value) => Console.WriteLine(value);
|
|
464
|
+
Print(42); // No boxing
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// Use structs for small, immutable data
|
|
468
|
+
public readonly struct Point(int x, int y)
|
|
469
|
+
{
|
|
470
|
+
public int X { get; } = x;
|
|
471
|
+
public int Y { get; } = y;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// Avoid string concatenation in loops
|
|
475
|
+
public string BuildString(List<string> items)
|
|
476
|
+
{
|
|
477
|
+
var builder = new StringBuilder();
|
|
478
|
+
foreach (var item in items)
|
|
479
|
+
{
|
|
480
|
+
builder.Append(item);
|
|
481
|
+
}
|
|
482
|
+
return builder.ToString();
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
## Quick Reference
|
|
487
|
+
|
|
488
|
+
| Optimization | Use Case | Benefit |
|
|
489
|
+
|-------------|----------|---------|
|
|
490
|
+
| `Span<T>` | Array/string operations | Zero allocation |
|
|
491
|
+
| `ArrayPool<T>` | Temporary buffers | Reduce GC pressure |
|
|
492
|
+
| `ValueTask<T>` | Frequently sync paths | Lower allocation |
|
|
493
|
+
| `ConfigureAwait(false)` | Libraries | Avoid context capture |
|
|
494
|
+
| Frozen collections | Static readonly data | Faster lookups |
|
|
495
|
+
| `AsNoTracking()` | Read-only queries | Better EF performance |
|
|
496
|
+
| Object pooling | Heavy objects | Reuse instances |
|
|
497
|
+
| Response caching | Static responses | Reduce server load |
|
|
498
|
+
| Native AOT | Startup time critical | Faster cold start |
|