diff --git a/.gitignore b/.gitignore index 16abd70..7c9d08e 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,8 @@ docs/superpowers/plans/ /VALIDATION_NOTES*.md /PR*_VALIDATION*.md /CHOCOLATEY_MODERATOR_NOTICE*.md +/IMPROVE_APP_PERFORMANCE_PLAN.md +/PERFORMANCE_*.md # Test and coverage [Tt]est[Rr]esult*/ diff --git a/Installer/Installer.iss b/Installer/Installer.iss index 7a3b598..332dfaa 100644 --- a/Installer/Installer.iss +++ b/Installer/Installer.iss @@ -5,7 +5,7 @@ #define MyAppPublisher "ThreadPilot" #define MyAppURL "https://github.com/" #define MyAppExeName "ThreadPilot.exe" -#define MyAppVersion "1.4.3" +#define MyAppVersion "1.4.4" #ifndef MyWizardStyle #define MyWizardStyle "modern dynamic windows11" diff --git a/Installer/ThreadPilot.wxs b/Installer/ThreadPilot.wxs index 2169298..cdd75d1 100644 --- a/Installer/ThreadPilot.wxs +++ b/Installer/ThreadPilot.wxs @@ -7,7 +7,7 @@ diff --git a/Installer/setup.iss b/Installer/setup.iss index d4af198..2300ee8 100644 --- a/Installer/setup.iss +++ b/Installer/setup.iss @@ -11,7 +11,7 @@ #endif #ifndef MyAppVersion - #define MyAppVersion "1.4.3" + #define MyAppVersion "1.4.4" #endif #ifndef MyAppSourceDir diff --git a/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs b/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs index d44bc2d..8677bbb 100644 --- a/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs +++ b/Tests/ThreadPilot.Core.Tests/PackagingMetadataTests.cs @@ -4,8 +4,8 @@ namespace ThreadPilot.Core.Tests public sealed partial class PackagingMetadataTests { - private const string ReleaseVersion = "1.4.3"; - private const string ReleaseAssemblyVersion = "1.4.3.0"; + private const string ReleaseVersion = "1.4.4"; + private const string ReleaseAssemblyVersion = "1.4.4.0"; [Fact] public void InnoInstallers_UseStableDisplayNameAndSeparateVersionMetadata() @@ -73,7 +73,6 @@ public void VersionMetadata_IsBumpedToReleaseVersion() AssertFileContains(Path.Combine(root, "build", "build-release.ps1"), $"[string]$Version = \"{ReleaseVersion}\""); AssertFileContains(Path.Combine(root, "build", "build-installer.ps1"), $"[string]$Version = \"{ReleaseVersion}\""); AssertFileContains(Path.Combine(root, "build", "package-release-zips.ps1"), $"[string]$Version = \"{ReleaseVersion}\""); - Assert.True(File.Exists(Path.Combine(root, "docs", "releases", $"v{ReleaseVersion}.md"))); AssertFileContains(Path.Combine(root, "docs", "release", "RELEASE_NOTES.md"), $"v{ReleaseVersion}"); } @@ -100,7 +99,7 @@ private static string FindRepositoryRoot() throw new InvalidOperationException("Repository root could not be located."); } - [GeneratedRegex("#define MyAppVersion \"1\\.4\\.3\"", RegexOptions.CultureInvariant)] + [GeneratedRegex("#define MyAppVersion \"1\\.4\\.4\"", RegexOptions.CultureInvariant)] private static partial Regex MyAppVersionRegex(); } } diff --git a/ThreadPilot.csproj b/ThreadPilot.csproj index 1cf32eb..6b9b3ba 100644 --- a/ThreadPilot.csproj +++ b/ThreadPilot.csproj @@ -16,10 +16,10 @@ link true CS1998;CS0067;CS0414;WFAC010;IL3000;MVVMTK0034 - 1.4.3 - 1.4.3.0 - 1.4.3.0 - 1.4.3 + 1.4.4 + 1.4.4.0 + 1.4.4.0 + 1.4.4 diff --git a/app.manifest b/app.manifest index e069943..1f6b8bd 100644 --- a/app.manifest +++ b/app.manifest @@ -1,6 +1,6 @@ - + diff --git a/build/build-installer.ps1 b/build/build-installer.ps1 index cfd7cd4..f8f81b2 100644 --- a/build/build-installer.ps1 +++ b/build/build-installer.ps1 @@ -1,5 +1,5 @@ param( - [string]$Version = "1.4.3", + [string]$Version = "1.4.4", [string]$Configuration = "Release", [switch]$SkipPublish ) diff --git a/build/build-release.ps1 b/build/build-release.ps1 index 237b4e3..c125432 100644 --- a/build/build-release.ps1 +++ b/build/build-release.ps1 @@ -1,5 +1,5 @@ param( - [string]$Version = "1.4.3", + [string]$Version = "1.4.4", [string]$Configuration = "Release", [string]$Runtime = "win-x64" ) diff --git a/build/package-release-zips.ps1 b/build/package-release-zips.ps1 index 28a8463..a8fbf32 100644 --- a/build/package-release-zips.ps1 +++ b/build/package-release-zips.ps1 @@ -1,5 +1,5 @@ param( - [string]$Version = "1.4.3" + [string]$Version = "1.4.4" ) $ErrorActionPreference = "Stop" diff --git a/chocolatey/threadpilot.nuspec b/chocolatey/threadpilot.nuspec index bdb898b..ca8dfed 100644 --- a/chocolatey/threadpilot.nuspec +++ b/chocolatey/threadpilot.nuspec @@ -2,7 +2,7 @@ threadpilot - 1.4.3 + 1.4.4 ThreadPilot Prime Build https://github.com/PrimeBuild-pc/ThreadPilot @@ -15,7 +15,7 @@ false Advanced Windows process and power plan manager with rules automation and performance controls. ThreadPilot process and power plan manager. - https://github.com/PrimeBuild-pc/ThreadPilot/releases/tag/v1.4.3 + https://github.com/PrimeBuild-pc/ThreadPilot/releases/tag/v1.4.4 threadpilot process powerplan performance windows diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index b5693a7..d2b8d66 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,22 @@ All notable changes to this project are documented in this file. +## v1.4.4 - Runtime efficiency + +### Performance + +- Reduced background idle CPU by approximately 80-100% in measured tray scenarios. +- Reduced CPU overhead during short-lived process churn by approximately 8%. +- Reduced hidden working-set memory by approximately 4-5% and peak handle usage by approximately 12-13%. +- Reduced external command launches during visible startup by approximately 85% (27 to 4 in the measured scenario). +- Deferred inactive views, reused process snapshots and static metadata, and removed redundant `powercfg` calls. +- Suspended hidden Log Viewer updates, made log flushing event-driven, and added bounded WMI recovery backoff. + +### Fixed + +- Persistent rules are cached without weakening process-start matching or CPU-priority verification and retry behavior. +- Process handles and PID-scoped runtime state are consistently cleaned up. + ## v1.4.3 - Expanded bundled power-plan catalog ### Added diff --git a/docs/release/RELEASE_NOTES.md b/docs/release/RELEASE_NOTES.md index 7ea8209..e781fc9 100644 --- a/docs/release/RELEASE_NOTES.md +++ b/docs/release/RELEASE_NOTES.md @@ -1,19 +1,38 @@ -## ThreadPilot v1.4.3 +## ThreadPilot v1.4.4 -Patch release expanding and validating ThreadPilot's bundled Windows power-plan catalog. +Patch release focused on reducing ThreadPilot's foreground and background runtime overhead while preserving process automation and persistent CPU-priority verification. -### Added +### Measured improvements -- Added 30 new bundled Windows power plans: 0 Synez Public Power, arsenha low latency, arsenha low latency (Intel Thread Director fix), AutoOS, BEYOND PERFORMANCE AMD+INTEL, Bitsum Highest Performance, cactusOS, FPSHEAVEN2026, GALA's ultimate performance (AMD), Gavot Performance, GTweaks Power Plan V3, imribiy2026, IrisFixed, JokrOS Power Plan, Jackpot2026, Kizzimo's Extreme Low Latency, KSOS11, melody LowestLatency, Microsoft High performance, Microsoft Ultimate Performance, Mitstas IDLE ENABLED, n1kobg GPU Booster Power Plan, Prodazin Power Plan, Reticle v2, RevisionPowerPlanV2.8, RIP Tweaks Power Plan, Rosca Tweaks v2, Velo's Power Plan, VTRL Optimized, and XNRL Pro Plan. -- Added structural, discovery, duplicate, packaging, and invalid-file tests for bundled power plans. +Compared with the official v1.4.3 build on the same system and using the same Release profile: -### Changed +- **Approximately 80-100% lower background idle CPU** in measured tray scenarios, reaching 0% in the final idle sample. +- **Approximately 8% lower CPU overhead during process churn** with 80 short-lived processes. +- **Approximately 4-5% lower hidden working-set memory**. +- **Approximately 12-13% lower peak handle usage** while hidden. +- **Approximately 85% fewer external command launches during visible startup**, reduced from 27 to 4. -- Updated four existing bundled plans: IIIEXOIII LOW LATENCY, LLG parking/E-core fix, Slower, and xilly. -- Removed a redundant duplicate Sazinho power-plan file. -- Power-plan display-name parsing now preserves names containing parentheses. +Results vary by hardware, Windows configuration, active page, and workload. The Process page remains intentionally more active while visible because it refreshes live process information. + +### Runtime changes + +- Cached persistent-rule snapshots in memory and pre-matched process starts before expensive enrichment. +- Disposed process handles consistently and cleared PID-scoped caches on process exit. +- Deferred initialization of inactive Power Plans, Rules, Settings, Tweaks, and Logs pages. +- Reused the process monitor's initial snapshot and PID/start-time-validated static process metadata. +- Parsed the active plan from a single `powercfg /list` call and limited periodic power-plan refresh to the visible Power Plans page. +- Suspended Log Viewer collection updates while hidden and changed log flushing to one-shot scheduling. +- Added WMI recovery backoff while preserving fallback polling reliability. + +### Compatibility and safety + +- Persistent rules, process start/stop tracking, and lazy diagnostics remain covered by regression tests. +- CPU-priority verification and the bounded retry introduced for issue #32 are unchanged. +- No default ThreadPilot affinity limit was enabled. ### Validation -- Every changed `.pow` file was imported successfully with `powercfg` using a temporary GUID and then removed; the active Windows power plan remained unchanged. -- Bundled assets are discovered automatically and copied to build, publish, portable ZIP, and installer output through the existing project and release workflow. +- Release build completed with zero warnings and zero errors. +- All 581 automated tests passed before release preparation. +- CI and CodeQL passed for both performance pull requests. +- NuGet dependency audit found no known vulnerable packages. diff --git a/sonar-project.properties b/sonar-project.properties index e7335af..0d59751 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,6 +1,6 @@ sonar.projectKey=threadpilot sonar.projectName=ThreadPilot -sonar.projectVersion=1.4.3 +sonar.projectVersion=1.4.4 sonar.sourceEncoding=UTF-8 sonar.sources=.