网站首页 网站源码

private static bool SimpleWildcardMatch(ReadOnlySpan<char> input, ReadOnlySpan<char> pattern)
{
// 简单的双指针 + 回溯算法
// 支持 * 和 ? 通配符
// 时间复杂度: O(m*n) 最坏情况,O(m+n) 平均情况
// 空间复杂度: O(1)
}
private static bool AdvancedMatchPattern(ReadOnlySpan<char> expression, ReadOnlySpan<char> name,
bool ignoreCase, bool useExtendedWildcards)
{
// 复杂的状态机算法
// 支持扩展通配符: *, ?, <, >, ", \
// 使用动态数组管理状态
// 时间复杂度: O(m*n) 但常数因子更大
// 空间复杂度: O(n) 用于状态管理
}
| 特性 | 简单算法 | 高级状态机 |
|---|---|---|
| 基础通配符 | ✅ * ? | ✅ * ? |
| 扩展通配符 | ❌ | ✅ < > " \ |
| 转义字符 | ❌ | ✅ \ |
| 特殊语义 | ❌ | ✅ 文件扩展名专用 |
| 代码复杂度 | 🟢 简单 | 🔴 复杂 |
| 可维护性 | 🟢 高 | 🔴 低 |
| 内存使用 | 🟢 O(1) | 🟡 O(n) |
* 开头的模式有特殊优化基于代码分析,我预测的性能表现:
简单场景(基础通配符):
- 简单算法:100ms
- 高级算法:150-200ms (1.5-2x 慢)
复杂场景(多个通配符):
- 简单算法:200ms
- 高级算法:300-400ms (1.5-2x 慢)
缓存场景(重复模式):
- 缓存 + 简单算法:10-20ms (5-10x 快)
/api/* # API 路径
/static/*.css # 静态资源
/admin/* # 管理界面
*.jpg # 图片文件
/user/*/profile # 用户配置
结论:Web 中间件很少需要高级算法的扩展功能。
private static bool OptimizedWebMatch(ReadOnlySpan<char> input, ReadOnlySpan<char> pattern)
{
// 特殊优化:快速前缀/后缀匹配
if (pattern.Length > 0 && pattern[0] == '*')
{
if (pattern.Length == 1) return true;
var suffix = pattern.Slice(1);
return input.EndsWith(suffix, StringComparison.OrdinalIgnoreCase);
}
if (pattern.Length > 0 && pattern[^1] == '*')
{
var prefix = pattern.Slice(0, pattern.Length - 1);
return input.StartsWith(prefix, StringComparison.OrdinalIgnoreCase);
}
// 回退到通用算法
return SimpleWildcardMatch(input, pattern);
}
// L1: 热点模式缓存(最近使用的 100 个模式)
private static readonly LRUCache<string, bool> HotCache = new(100);
// L2: 一般模式缓存(10,000 个模式)
private static readonly ConcurrentDictionary<(string, string), bool> GeneralCache = new();
// 启动时预编译常用模式
private static readonly Dictionary<string, Func<string, bool>> CompiledPatterns = new()
{
["/api/*"] = input => input.StartsWith("/api/"),
["*.css"] = input => input.EndsWith(".css"),
// ... 更多预编译模式
};
推荐使用简单算法 + 缓存,原因:
如果需要处理复杂的文件匹配模式(如扩展通配符),可以考虑:
运行 AdvancedWildcardComparisonTest 可以验证:
对于你的 Web 中间件场景,简单算法 + 缓存是最佳选择:
高级状态机算法虽然功能更强大,但对于 Web 中间件来说是"大炮打蚊子",带来了不必要的复杂性和性能开销。
