Node.js从12.18.3升级至18.13.0后toLocaleString()性能骤降求助
Node.js 18.13.0下toLocaleString()在Windows服务中性能暴跌的解决办法
问题背景
我们将Windows环境下的Node.js从12.18.3升级至18.13.0后,发现toLocaleString("sv-SE", { month: "2-digit", year: "numeric", day: "2-digit" })的执行耗时变为之前的10倍。该问题仅在API作为Windows服务启动时出现,命令提示符中启动则性能正常。我们用这个函数生成指定日期区间的yyyy-MM-dd格式字符串数组。
可能原因
Node.js 16+版本对ICU(国际化组件)的加载逻辑做了调整,当以Windows服务身份运行时,进程可能无法正确初始化或缓存ICU本地化配置,导致每次调用toLocaleString都要重新加载本地化数据,而命令行启动时能正常复用缓存。
解决方案
方案1:替换toLocaleString为手动格式化(推荐)
因为目标格式是固定的yyyy-MM-dd,完全不需要依赖本地化函数,手动格式化性能更稳定,且不受环境/版本影响:
// 替换原toLocaleString调用的手动格式化函数 function formatISODate(date) { const year = date.getFullYear(); // 月份从0开始,所以+1后补0 const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } // 在strDateArr中使用 let relDateStr = formatISODate(relDate);
方案2:预加载本地化配置,强制缓存
如果必须保留toLocaleString,可以在服务启动时提前初始化一次该函数,让Node.js缓存本地化配置,后续调用直接复用:
// 服务启动时执行一次,缓存sv-SE的本地化规则 new Date().toLocaleString("sv-SE", { month: "2-digit", year: "numeric", day: "2-digit", });
方案3:调整Windows服务的运行环境
- 检查服务的运行用户:将服务运行账户改为当前登录用户(而非Local System),确保进程能访问命令行用户环境下的ICU缓存路径。
- 手动指定ICU数据目录:启动Node.js时添加
--icu-data-dir参数,指向Node.js自带的ICU数据目录(通常在Node.js安装目录下的icudt*.dat文件路径)。
内容的提问来源于stack exchange,提问作者python_is_my_snake
相关产品推荐
相关产品推荐

