瀏覽代碼

Perf: improve `processLine` performance

SukkaW 1 年之前
父節點
當前提交
1ce322a71c
共有 3 個文件被更改,包括 30 次插入22 次删除
  1. 21 0
      Build/lib/process-line.test.ts
  2. 9 13
      Build/lib/process-line.ts
  3. 0 9
      Build/lib/singbox.ts

+ 21 - 0
Build/lib/process-line.test.ts

@@ -0,0 +1,21 @@
+import { describe, it } from 'mocha';
+
+import { processLine } from './process-line';
+import expect from 'expect';
+
+describe('processLine', () => {
+  ([
+    ['! comment', null],
+    ['  ! comment', null],
+    ['// xommwnr', null],
+    ['# comment', null],
+    ['   # comment', null],
+    ['###id', '###id'],
+    ['##.class', '##.class'],
+    ['## EOF', '## EOF']
+  ] as const).forEach(([input, expected]) => {
+    it(input, () => {
+      expect(processLine(input)).toBe(expected);
+    });
+  });
+});

+ 9 - 13
Build/lib/process-line.ts

@@ -1,33 +1,29 @@
 import { TransformStream } from 'node:stream/web';
 
 export function processLine(line: string): string | null {
-  if (!line) {
-    return null;
-  }
-
   const trimmed: string = line.trim();
   if (trimmed.length === 0) {
     return null;
   }
 
-  const line_0: string = trimmed[0];
+  const line_0 = trimmed.charCodeAt(0);
 
   if (
-    line_0 === ' '
-    || line_0 === '\r'
-    || line_0 === '\n'
-    || line_0 === '!'
-    || (line_0 === '/' && trimmed[1] === '/')
+    // line_0 === 32 /** [space] */
+    // || line_0 === 13 /** \r */
+    // || line_0 === 10 /** \n */
+    line_0 === 33 /** ! */
+    || (line_0 === 47 /** / */ && trimmed.charCodeAt(1) === 47 /** / */)
   ) {
     return null;
   }
 
-  if (line_0 === '#') {
-    if (trimmed[1] !== '#') {
+  if (line_0 === 35 /** # */) {
+    if (trimmed.charCodeAt(1) !== 35 /** # */) {
       // # Comment
       return null;
     }
-    if (trimmed[2] === '#' && trimmed[3] === '#') {
+    if (trimmed.charCodeAt(2) === 35 /** # */ && trimmed.charCodeAt(3) === 35) {
       // ################## EOF ##################
       return null;
     }

+ 0 - 9
Build/lib/singbox.ts

@@ -1,12 +1,3 @@
-// const unsupported = Symbol('unsupported');
-
-// https://sing-box.sagernet.org/configuration/rule-set/source-format/
-// export const PROCESSOR: Record<string, ((raw: string, type: string, value: string) => [key: keyof SingboxHeadlessRule, value: Required<SingboxHeadlessRule>[keyof SingboxHeadlessRule][number]] | null) | typeof unsupported> = {
-//   'IP-ASN': unsupported,
-//   'URL-REGEX': unsupported,
-//   'USER-AGENT': unsupported
-// };
-
 interface SingboxHeadlessRule {
   domain?: string[],
   domain_suffix?: string[],