Token导航 LogoToken导航

Agent Skill · 研究检索

performance(性能)

performance 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

performance 是研究检索类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为操作浏览器;许可证为 MIT,暂无第三方扫描结果,按安装量在研究检索类的 73,675 个 Skill 里排第 63,254。

总安装 318周安装 13GitHub Stars 公开资料未说明下载 102核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
MIT

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:performance(性能)
来源仓库:https://github.com/yosrbennagra/3sc
仓库路径:skills/performance
安装命令:
npx skills add yosrbennagra/3sc --skill "performance"
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

AgentSkills.tonpx skills
npx skills add yosrbennagra/3sc --skill "performance"

这个 Skill 是做什么的

研究检索类 Skill 主要解决「找资料、核对事实、把来源整理清楚」的问题,通常会让助手先检索再总结。

performance 用于查找、检索和筛选相关信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要根据关键词、任务场景或来源线索快速定位候选结果时使用。适用于性能相关的研究和信息筛选,可结合来源仓库和原始 README 继续核验具体用法。

通过 npx skills add yosrbennagra/3sc --skill "performance" 命令安装。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

来源仓库内路径:skills/performance

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add yosrbennagra/3sc --skill "performance";命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要操作浏览器,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

performance 怎么安装?

在终端执行 npx skills add yosrbennagra/3sc --skill "performance"。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

performance 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

performance 需要什么权限?

权限级别是操作浏览器。该 Skill 可能涉及浏览器控制能力,使用时可能读取或操作网页内容,需要在受控环境中确认权限边界。

performance 是免费的吗?

来源标注的许可证是 MIT。本站不代收任何费用,也不托管安装包;能否商用、要不要署名,以许可证原文为准。

performance 用的人多吗?

公开数据是累计安装 318 次,近一周安装 13 次,下载 102 次。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

performance 安全吗?

没有查到第三方扫描结果,安全性无法从公开资料判断,安装前请自行审查源码、依赖和命令行为。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 许可证明确为 MIT,商用和分发边界好判断。

先想清楚的地方

  • 没有第三方扫描结果,安全性只能靠自己读源码判断。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理研究检索类任务、又不想每次都手写提示词的人。

不太适合

  • 要求有安全扫描结论才肯安装的团队。
  • 需要厂商级技术支持和 SLA 的生产系统。

研究检索类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
find-skills

寻找技能 · Codex、Claude

31,199,81316,486操作浏览器MIT有提醒
self-improving-agent

自我改进 Agent · OpenClaw

16,464,0023,396接触敏感数据MIT-0通过
soultrace

灵魂追踪 · Codex、Claude

7,588,94412需要联网未明确有提醒
self-improving

自我完善 · OpenClaw

6,829,2841,046需要联网MIT-0通过
microsoft-foundry

微软代工厂 · Codex、Claude

6,614,144764调用外部服务未明确有提醒
performance

性能 · 本页

318—操作浏览器MIT未收录

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

name
performance
description
Performance optimization patterns for the 3SC widget host. Covers startup time, memory management, UI responsiveness, profiling, and optimization strategies.

Performance

Overview

A performant desktop application starts quickly, responds immediately to user input, and uses resources efficiently. This skill covers performance patterns for WPF applications.

Definition of Done (DoD)

  • [ ] Application starts in under 3 seconds on typical hardware
  • [ ] UI remains responsive during background operations
  • [ ] Memory usage stays bounded during normal use
  • [ ] No memory leaks after extended use
  • [ ] Large operations show progress feedback
  • [ ] Performance-critical paths are profiled and optimized

Performance Targets

MetricTargetMeasurement
Cold startup< 3sTime to usable shell
Warm startup< 1sSubsequent launches
UI response< 100msInput to visual feedback
Frame rate60 FPSDuring animations
Memory (idle)< 150MBAfter startup
Memory (active)< 500MBWith 10+ widgets

Startup Optimization

Lazy Initialization

public sealed class ServiceLocator
{
    // ✅ GOOD - Defer expensive initialization
    private readonly Lazy<AppDbContext> _dbContext;
    private readonly Lazy<IWorkshopSyncService> _syncService;
    
    private ServiceLocator()
    {
        // Database context created on first use
        _dbContext = new Lazy<AppDbContext>(() =>
        {
            var options = CreateDbOptions();
            var context = new AppDbContext(options);
            context.Database.EnsureCreated();
            return context;
        });
        
        // Sync service not needed until user requests
        _syncService = new Lazy<IWorkshopSyncService>(() =>
            new WorkshopSyncService(/* deps */));
    }
}

Startup Timing

public class StartupTimer
{
    public static StartupTimer Instance { get; } = new();
    
    private readonly Stopwatch _stopwatch = new();
    private readonly List<(string Name, long ElapsedMs)> _checkpoints = new();
    private string _currentPhase = "Init";
    
    public void Start() => _stopwatch.Start();
    
    public void BeginPhase(string phase)
    {
        Checkpoint($"{_currentPhase}Complete");
        _currentPhase = phase;
    }
    
    public void Checkpoint(string name)
    {
        _checkpoints.Add((name, _stopwatch.ElapsedMilliseconds));
    }
    
    public void Complete()
    {
        _stopwatch.Stop();
        Checkpoint("StartupComplete");
        
        Log.Information("Startup completed in {TotalMs}ms", _stopwatch.ElapsedMilliseconds);
        
        foreach (var (name, elapsed) in _checkpoints)
        {
            Log.Debug("Startup checkpoint: {Name} at {Elapsed}ms", name, elapsed);
        }
        
        TelemetryEventSource.Log.StartupTiming(_stopwatch.ElapsedMilliseconds);
    }
}

// Usage in App.xaml.cs
protected override void OnStartup(StartupEventArgs e)
{
    StartupTimer.Instance.Start();
    
    StartupTimer.Instance.BeginPhase("Logging");
    LogBootstrapper.Initialize();
    
    StartupTimer.Instance.BeginPhase("UI");
    InitializeTrayIcon();
    InitializeShell();
    
    StartupTimer.Instance.BeginPhase("Data");
    // Async, don't block
    _ = LoadWidgetsAsync();
    
    StartupTimer.Instance.Complete();
}

Defer Non-Critical Work

protected override async void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    
    // Critical path - show UI immediately
    _shellWindow = new ShellWindow();
    _shellWindow.Show();
    
    // Defer non-critical initialization
    await Dispatcher.InvokeAsync(async () =>
    {
        await Task.Delay(500);  // Let UI render first
        
        // Now load widgets, sync, etc.
        await LoadWidgetsAsync();
        await CheckForUpdatesAsync();
    }, DispatcherPriority.Background);
}

UI Responsiveness

Async Commands

[RelayCommand]
private async Task LoadWidgetsAsync(CancellationToken ct)
{
    IsLoading = true;
    
    try
    {
        // Run on background thread
        var widgets = await Task.Run(
            () => _repository.GetAllAsync(ct), ct);
        
        // Update UI on dispatcher
        Widgets = new ObservableCollection<WidgetViewModel>(
            widgets.Select(w => new WidgetViewModel(w)));
    }
    finally
    {
        IsLoading = false;
    }
}

Progress Reporting

[RelayCommand]
private async Task InstallPackagesAsync(
    IEnumerable<WidgetPackage> packages, 
    CancellationToken ct)
{
    var packageList = packages.ToList();
    var total = packageList.Count;
    var current = 0;
    
    Progress = 0;
    StatusMessage = "Installing widgets...";
    
    foreach (var package in packageList)
    {
        ct.ThrowIfCancellationRequested();
        
        StatusMessage = $"Installing {package.DisplayName}...";
        await _installer.InstallAsync(package, ct);
        
        current++;
        Progress = (double)current / total * 100;
    }
    
    StatusMessage = $"Installed {total} widgets";
}

UI Thread Monitor

public class UiResponsivenessMonitor : IDisposable
{
    private readonly DispatcherTimer _timer;
    private DateTimeOffset _lastTick;
    private const int WarningThresholdMs = 200;
    
    public UiResponsivenessMonitor()
    {
        _timer = new DispatcherTimer
        {
            Interval = TimeSpan.FromMilliseconds(100)
        };
        _timer.Tick += OnTick;
    }
    
    public void Start()
    {
        _lastTick = DateTimeOffset.UtcNow;
        _timer.Start();
    }
    
    private void OnTick(object? sender, EventArgs e)
    {
        var now = DateTimeOffset.UtcNow;
        var elapsed = (now - _lastTick).TotalMilliseconds;
        
        if (elapsed > WarningThresholdMs)
        {
            Log.Warning(
                "UI thread blocked for {Elapsed}ms (expected ~100ms)",
                elapsed);
            
            TelemetryEventSource.Log.UiBlocked((long)elapsed);
        }
        
        _lastTick = now;
    }
    
    public void Stop() => _timer.Stop();
    public void Dispose() => _timer.Stop();
}

Memory Management

Memory Monitoring

public class MemoryMonitor
{
    public static MemoryMonitor Instance { get; } = new();
    
    private readonly Dictionary<string, long> _snapshots = new();
    
    public void TakeSnapshot(string name)
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        
        var memory = GC.GetTotalMemory(forceFullCollection: false);
        _snapshots[name] = memory;
        
        Log.Debug("Memory snapshot {Name}: {MemoryMB:F2}MB", 
            name, memory / 1024.0 / 1024.0);
    }
    
    public void CheckForLeaks()
    {
        if (_snapshots.TryGetValue("AppStarted", out var startMemory) &&
            _snapshots.TryGetValue("AppShutdown", out var endMemory))
        {
            var growthMb = (endMemory - startMemory) / 1024.0 / 1024.0;
            
            if (growthMb > 100)  // More than 100MB growth
            {
                Log.Warning(
                    "Potential memory leak: Memory grew by {GrowthMB:F2}MB during session",
                    growthMb);
            }
        }
    }
    
    public MemoryInfo GetCurrentInfo()
    {
        var process = Process.GetCurrentProcess();
        
        return new MemoryInfo
        {
            ManagedMemoryMB = GC.GetTotalMemory(false) / 1024.0 / 1024.0,
            WorkingSetMB = process.WorkingSet64 / 1024.0 / 1024.0,
            PrivateMemoryMB = process.PrivateMemorySize64 / 1024.0 / 1024.0,
            Gen0Collections = GC.CollectionCount(0),
            Gen1Collections = GC.CollectionCount(1),
            Gen2Collections = GC.CollectionCount(2)
        };
    }
}

public record MemoryInfo
{
    public double ManagedMemoryMB { get; init; }
    public double WorkingSetMB { get; init; }
    public double PrivateMemoryMB { get; init; }
    public int Gen0Collections { get; init; }
    public int Gen1Collections { get; init; }
    public int Gen2Collections { get; init; }
}

Avoiding Memory Leaks

// ❌ BAD - Event handler leak
public class WidgetViewModel
{
    public WidgetViewModel(IEventAggregator events)
    {
        events.ThemeChanged += OnThemeChanged;  // Never unsubscribed!
    }
}

// ✅ GOOD - Weak event or explicit unsubscription
public class WidgetViewModel : IDisposable
{
    private readonly IEventAggregator _events;
    
    public WidgetViewModel(IEventAggregator events)
    {
        _events = events;
        _events.ThemeChanged += OnThemeChanged;
    }
    
    public void Dispose()
    {
        _events.ThemeChanged -= OnThemeChanged;
    }
}

// ✅ BETTER - Use WeakEventManager
public class WidgetViewModel
{
    public WidgetViewModel(IEventAggregator events)
    {
        WeakEventManager<IEventAggregator, EventArgs>.AddHandler(
            events, nameof(events.ThemeChanged), OnThemeChanged);
    }
}

Dispose Pattern

public class WidgetWindow : Window, IDisposable
{
    private readonly DispatcherTimer _timer;
    private readonly HttpClient _httpClient;
    private bool _disposed;
    
    protected virtual void Dispose(bool disposing)
    {
        if (_disposed) return;
        
        if (disposing)
        {
            _timer.Stop();
            _httpClient.Dispose();
        }
        
        _disposed = true;
    }
    
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    
    protected override void OnClosed(EventArgs e)
    {
        Dispose();
        base.OnClosed(e);
    }
}

Database Performance

Query Optimization

// ❌ BAD - N+1 queries
foreach (var widget in widgets)
{
    var instances = await _instanceRepo.GetByWidgetKeyAsync(widget.WidgetKey);
}

// ✅ GOOD - Single query with includes
var widgetsWithInstances = await _context.Widgets
    .Include(w => w.Instances)
    .AsNoTracking()
    .ToListAsync(ct);

// ✅ GOOD - Projection to DTO
var widgetSummaries = await _context.Widgets
    .Select(w => new WidgetSummary
    {
        Key = w.WidgetKey,
        Name = w.DisplayName,
        InstanceCount = w.Instances.Count
    })
    .ToListAsync(ct);

Pagination

public async Task<PagedResult<Widget>> GetPagedAsync(
    int page, 
    int pageSize, 
    CancellationToken ct)
{
    var query = _context.Widgets.AsNoTracking();
    
    var totalCount = await query.CountAsync(ct);
    
    var items = await query
        .OrderBy(w => w.DisplayName)
        .Skip((page - 1) * pageSize)
        .Take(pageSize)
        .ToListAsync(ct);
    
    return new PagedResult<Widget>
    {
        Items = items,
        TotalCount = totalCount,
        Page = page,
        PageSize = pageSize
    };
}

Virtualization

UI Virtualization

<!-- ✅ GOOD - Virtualized list for large collections -->
<ListBox ItemsSource="{Binding Widgets}"
         VirtualizingStackPanel.IsVirtualizing="True"
         VirtualizingStackPanel.VirtualizationMode="Recycling"
         ScrollViewer.IsDeferredScrollingEnabled="True">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

<!-- For grid layouts -->
<ItemsControl ItemsSource="{Binding Widgets}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingWrapPanel />  <!-- Custom panel -->
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Profiling Checklist

Before Optimization

  1. Measure first - Don't guess, profile
  2. Set targets - Define acceptable performance
  3. Identify bottlenecks - Focus on hot paths
  4. Test on target hardware - Not just dev machines

Tools

ToolPurpose
Visual Studio ProfilerCPU, memory, UI analysis
PerfViewETW traces, GC analysis
dotMemoryMemory snapshots, leak detection
BenchmarkDotNetMicro-benchmarks

Key Metrics to Track

public static class PerformanceCounters
{
    private static readonly Stopwatch AppUptime = Stopwatch.StartNew();
    private static long _operationCount;
    
    public static void RecordOperation() => 
        Interlocked.Increment(ref _operationCount);
    
    public static void LogPerformanceSummary()
    {
        var memory = MemoryMonitor.Instance.GetCurrentInfo();
        
        Log.Information(
            "Performance summary - Uptime: {Uptime}, Operations: {OpCount}, " +
            "Memory: {MemoryMB:F1}MB, GC Gen2: {Gen2}",
            AppUptime.Elapsed,
            _operationCount,
            memory.WorkingSetMB,
            memory.Gen2Collections);
    }
}

Anti-Patterns

Anti-PatternImpactSolution
Sync over asyncUI freezeUse async/await properly
Large object allocationsGC pressurePool or reuse objects
Binding to complex objectsSlow renderingUse lightweight ViewModels
Missing virtualizationMemory bloatEnable UI virtualization
Unbounded collectionsMemory growthUse pagination/windowing

References

平台分布

Gemini CLI

29.08%
按下载量换算30

windsurf

25.44%
按下载量换算26

trae

19.47%
按下载量换算20

OpenCode

12.56%
按下载量换算13

Codex

7.73%
按下载量换算8

Claude Code

3.7%
按下载量换算4

安全审计

暂无安全审计结果可展示。

权限和风险

操作浏览器

该 Skill 可能涉及浏览器控制能力,使用时可能读取或操作网页内容,需要在受控环境中确认权限边界。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills