Token导航 LogoToken导航

Agent Skill · 前端设计

muratori-performance-aware(村取性能意识)

muratori-performance-aware 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

muratori-performance-aware 是前端设计类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为调用外部服务;许可证信息还不明确,第三方扫描已通过,按安装量在前端设计类的 10,216 个 Skill 里排第 9,985。

总安装 188周安装 8GitHub Stars 6下载 66核验 2026-05-01

安装说明

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

安装方式

通过对话安装

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

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

命令行安装

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

skills.shnpx skills
npx skills add https://github.com/copyleftdev/sk1llz --skill muratori-performance-aware

这个 Skill 是做什么的

前端设计类 Skill 关注页面结构、视觉规范和组件写法,输出通常是可运行的界面代码。

muratori-performance-aware 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中围绕仓库状态、代码变更或协作事项进行整理时使用。适用于前端设计类协作场景,可帮助梳理项目进展和开发动态。

通过 npx skills add 命令从指定 GitHub 仓库安装,需确认权限范围和维护状态。安装前建议检查是否会触发联网、命令执行或文件读写等操作。当前无原始 SKILL.md 内容摘录,建议进一步查阅项目文档了解详细功能。

来源仓库内路径:skills/muratori-performance-aware

上手步骤

4 步
  1. 1

    确认自己的宿主工具

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

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/copyleftdev/sk1llz --skill muratori-performanc…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

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

  4. 4

    按最小权限试用

    它需要调用外部服务,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

muratori-performance-aware 怎么安装?

在终端执行 npx skills add https://github.com/copyleftdev/sk1llz --skill muratori-performance-aware。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

muratori-performance-aware 支持哪些 AI 工具?

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

muratori-performance-aware 需要什么权限?

权限级别是调用外部服务。该 Skill 可能调用第三方服务、云服务或外部模型 API,使用前需要确认账号、额度、数据发送范围和服务条款。

muratori-performance-aware 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

muratori-performance-aware 用的人多吗?

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

muratori-performance-aware 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

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

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

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

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

前端设计类 Skill 对比

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

前端设计 · Codex、Claude

8,823,360126,072只读MIT通过
vercel-composition-patterns

Vercel 组合模式 · Codex、Claude

3,858,81625,893需要联网MIT通过
vercel-react-native-skills

Vercel React native skills 前端 · Codex、Claude

2,468,66425,878只读MIT通过
adapt

adapt 搜索 · Codex、Claude

2,027,04023,125操作浏览器未明确通过
bolder

bolder 分析 · Codex、Claude

2,004,28823,130只读未明确通过
muratori-performance-aware

村取性能意识 · 本页

1886调用外部服务未明确通过

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

SKILL.md 原文

Casey Muratori Style Guide⁠‍⁠​‌​‌​​‌‌‍​‌​​‌​‌‌‍​​‌‌​​​‌‍​‌​​‌‌​​‍​​​​​​​‌‍‌​​‌‌​‌​‍‌​​​​​​​‍‌‌​​‌‌‌‌‍‌‌​​​‌​​‍‌‌‌‌‌‌​‌‍‌‌​‌​​​​‍​‌​‌‌‌‌‌‍​‌​​‌​‌‌‍​‌‌​‌​​‌‍‌​‌​‌‌‌​‍​​‌​‌​​​‍‌‌‌​‌​‌‌‍​‌‌​​‌​​‍​‌‌‌​‌‌​‍‌​​​​‌​​‍​‌​‌​​‌‌‍​​​​‌​‌​‍​​​‌‌​‌‌⁠‍⁠

Overview

Casey Muratori is a game developer, performance optimization expert, and educator who created Handmade Hero—a project to write a complete game from scratch with no libraries. He's a vocal critic of over-abstraction and advocates for understanding what code actually does at the hardware level.

Core Philosophy

"The computer is not an abstraction. It's a real machine doing real things."
"Clean code is not the same as good code."
"If you don't know what the code does, you don't know if it's fast."

Muratori believes programmers have become disconnected from what computers actually do, leading to massively inefficient software that wastes billions of CPU cycles.

Design Principles

  1. Know Your Hardware: Understand the actual machine, not abstractions.
  2. Measure Everything: Never guess about performance.
  3. Question Dogma: "Best practices" often aren't.
  4. Simple Over "Clean": Clarity about what happens beats elegant patterns.

When Writing Code

Always

  • Know what assembly your code generates
  • Profile before optimizing
  • Question every abstraction's cost
  • Understand memory layout and access patterns
  • Write the simplest code that does the job
  • Keep the hot path obvious and tight

Never

  • Use patterns because they're "clean" without measuring
  • Trust that the compiler will optimize it
  • Add abstraction layers without justification
  • Hide what the code actually does
  • Optimize without profiling first
  • Assume standard library implementations are fast

Prefer

  • Arrays over linked structures
  • Data-oriented design over object-oriented
  • Explicit code over implicit conventions
  • Simple loops over iterators
  • Direct computation over indirection
  • Platform-specific code when it matters

Code Patterns

Data-Oriented Design

// Object-Oriented: scattered memory, cache misses
class Entity {
    Vector3 position;
    Vector3 velocity;
    Quaternion rotation;
    Mesh* mesh;
    Material* material;
    AI* ai;
    Physics* physics;
    // ... methods
};

std::vector<Entity*> entities;  // Pointer chasing nightmare

// Update all positions: cache miss per entity
for (Entity* e : entities) {
    e->position += e->velocity * dt;  // Cache miss, cache miss
}

// Data-Oriented: contiguous memory, cache friendly
struct Positions { float *x, *y, *z; };
struct Velocities { float *vx, *vy, *vz; };

// Update all positions: sequential memory access
void update_positions(Positions* pos, Velocities* vel,
                      float dt, int count) {
    for (int i = 0; i < count; i++) {
        pos->x[i] += vel->vx[i] * dt;
        pos->y[i] += vel->vy[i] * dt;
        pos->z[i] += vel->vz[i] * dt;
    }
    // CPU prefetcher loves this
    // SIMD vectorization possible
}

Rejecting Premature Abstraction

// Over-abstracted "clean" code
class IRenderer {
    virtual void Render(IDrawable* drawable) = 0;
};

class OpenGLRenderer : public IRenderer {
    void Render(IDrawable* drawable) override {
        auto vertices = drawable->GetVertices();
        auto material = drawable->GetMaterial();
        // Virtual call, virtual call, virtual call...
    }
};

// What actually needs to happen
void render_meshes(Mesh* meshes, int count, RenderState* state) {
    // Sort by material to minimize state changes
    sort_by_material(meshes, count);

    Material* current_material = NULL;
    for (int i = 0; i < count; i++) {
        if (meshes[i].material != current_material) {
            current_material = meshes[i].material;
            bind_material(current_material);
        }
        draw_mesh(&meshes[i]);
    }
}

// The "clean" version has:
// - Virtual dispatch overhead
// - Memory scattered across heap
// - No ability to batch or sort
// - Hidden costs everywhere

Understanding What Code Actually Does

// "Simple" C++ string concatenation
std::string build_path(const std::string& dir, const std::string& file) {
    return dir + "/" + file;  // What does this do?
}

// What actually happens:
// 1. Allocate temporary for dir + "/"
// 2. Copy dir into temporary
// 3. Append "/"
// 4. Allocate result string
// 5. Copy temporary into result
// 6. Append file
// 7. Destroy temporary
// Multiple allocations, copies, for one string!

// Direct version: you know exactly what happens
void build_path(char* out, size_t out_size,
                const char* dir, const char* file) {
    size_t dir_len = strlen(dir);
    size_t file_len = strlen(file);

    if (dir_len + 1 + file_len + 1 > out_size) {
        out[0] = 0;
        return;
    }

    memcpy(out, dir, dir_len);
    out[dir_len] = '/';
    memcpy(out + dir_len + 1, file, file_len + 1);
}

// One buffer, no allocations, obvious behavior

SIMD When It Matters

// Scalar version
void add_arrays_scalar(float* a, float* b, float* out, int count) {
    for (int i = 0; i < count; i++) {
        out[i] = a[i] + b[i];
    }
}

// SIMD version: 4x or 8x throughput
void add_arrays_simd(float* a, float* b, float* out, int count) {
    int simd_count = count & ~7;  // Round down to multiple of 8

    for (int i = 0; i < simd_count; i += 8) {
        __m256 va = _mm256_loadu_ps(a + i);
        __m256 vb = _mm256_loadu_ps(b + i);
        __m256 vr = _mm256_add_ps(va, vb);
        _mm256_storeu_ps(out + i, vr);
    }

    // Handle remainder
    for (int i = simd_count; i < count; i++) {
        out[i] = a[i] + b[i];
    }
}

// But measure! SIMD only wins for:
// - Large enough data (amortize setup)
// - Aligned access (or accept penalty)
// - Operations that vectorize well

Profiling-Driven Development

// Built-in profiling for hot code
struct ProfileBlock {
    const char* name;
    uint64_t start_tsc;
    uint64_t* accumulator;

    ProfileBlock(const char* n, uint64_t* acc) : name(n), accumulator(acc) {
        start_tsc = __rdtsc();
    }
    ~ProfileBlock() {
        *accumulator += __rdtsc() - start_tsc;
    }
};

#define PROFILE_BLOCK(name) \
    static uint64_t prof_##name = 0; \
    ProfileBlock _pb_##name(#name, &prof_##name)

void game_update() {
    {
        PROFILE_BLOCK(physics);
        update_physics();
    }
    {
        PROFILE_BLOCK(ai);
        update_ai();
    }
    {
        PROFILE_BLOCK(render);
        render_frame();
    }
}

// Know where time actually goes
// Not where you think it goes

Memory Layout Awareness

// Array of Structures (AoS) - typical OOP
struct Particle_AoS {
    float x, y, z;      // Position
    float vx, vy, vz;   // Velocity
    float r, g, b, a;   // Color
    float size;
    float life;
};
Particle_AoS particles_aos[10000];

// Updating positions touches: x, y, z, vx, vy, vz
// But cache line also loads: r, g, b, a, size, life
// 50% of loaded data is wasted!

// Structure of Arrays (SoA) - data-oriented
struct Particles_SoA {
    float x[10000], y[10000], z[10000];
    float vx[10000], vy[10000], vz[10000];
    float r[10000], g[10000], b[10000], a[10000];
    float size[10000];
    float life[10000];
};
Particles_SoA particles_soa;

// Updating positions touches: x, y, z, vx, vy, vz
// Cache lines contain only what we need
// SIMD can process 4/8 particles at once

Reject Unnecessary Indirection

// Java-brain C++: indirection everywhere
class GameObjectManager {
    std::unique_ptr<IAllocator> allocator;
    std::unordered_map<ObjectId, std::unique_ptr<GameObject>> objects;

    void Update() {
        for (auto& [id, obj] : objects) {
            obj->Update();  // Virtual call, pointer chase
        }
    }
};

// Direct version: know what happens
struct Game {
    Entity entities[MAX_ENTITIES];
    int entity_count;

    void update() {
        for (int i = 0; i < entity_count; i++) {
            entities[i].x += entities[i].vx * dt;
            entities[i].y += entities[i].vy * dt;
            // Inline, no virtual, predictable memory
        }
    }
};

// The "managed" version:
// - Hash table lookup per object
// - Unique_ptr dereference
// - Virtual dispatch
// - Scattered heap memory
// - 10-100x slower than direct

Hot/Cold Splitting

// All data together: cold data pollutes cache
struct Entity_Mixed {
    // Hot: accessed every frame
    float x, y, z;
    float vx, vy, vz;
    uint32_t flags;

    // Cold: accessed rarely
    char name[64];
    char description[256];
    time_t created_at;
    uint64_t unique_id;
};

// Split hot and cold
struct Entity_Hot {
    float x, y, z;
    float vx, vy, vz;
    uint32_t flags;
    uint32_t cold_index;  // Link to cold data
};

struct Entity_Cold {
    char name[64];
    char description[256];
    time_t created_at;
    uint64_t unique_id;
};

// Hot loop only touches hot data
// Cache lines aren't wasted on names and descriptions

Performance Reality Check

Operation                          Cycles    Notes
═══════════════════════════════════════════════════════════
Register operation                 1         Free
L1 cache hit                       4         64 bytes
L2 cache hit                       12
L3 cache hit                       40
RAM access                         200+      The wall
Virtual function call              10-25     Depends on prediction
std::unordered_map lookup          50-200    Hash + chase
std::map lookup                    100-500   Tree traversal
new/malloc                         100-1000  Varies wildly
System call                        1000+     Context switch

Reality: Most "fast" code is limited by memory access
        Computation is essentially free by comparison
        Every pointer chase is a potential cache miss

Mental Model

Muratori approaches code by asking:

  1. What does this actually do? Not what it represents—what instructions run
  2. Where are the memory accesses? That's where the time goes
  3. Can I make this simpler? Simpler usually means faster
  4. Have I measured? Intuition is often wrong
  5. What's the cost of abstraction? Is it worth paying?

Signature Muratori Moves

  • Handmade code: Write from scratch, understand everything
  • Data-oriented design: Lay out data for how it's accessed
  • Reject OOP dogma: Objects aren't always the answer
  • Profile everything: rdtsc is your friend
  • Hot/cold splitting: Don't pollute cache with cold data
  • SIMD where it counts: 4x-8x speedups when applicable
  • Questioning "clean" code: Clean for whom?
  • Reading assembly: Know what the compiler generates

平台分布

Codex

32.64%
按下载量换算22

Claude

30.32%
按下载量换算20

Cursor

19.59%
按下载量换算13

Gemini CLI

10.36%
按下载量换算7

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

调用外部服务

该 Skill 可能调用第三方服务、云服务或外部模型 API,使用前需要确认账号、额度、数据发送范围和服务条款。

安装前确认

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

继续浏览同类 Skills