nodejs / nodejs/node

assert.ok: extremely slow error message generation for some code

Đang mở
#52,677 11 bình luận 1 reaction 1 người được giao Xem trên GitHub

@avivkeller đang làm issue này rồi.

Từ ngày 25/8/2026.

assert confirmed-bug performance
Ngôn ngữ chính
JavaScript
Star
122k
Fork
37.4k
Merge trung bình
4 ngày 2 giờ
Pull request đã merge (30 ngày)
283

Mô tả

Version

v20.11.1

Platform

Darwin wololobook 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:11:05 PDT 2024; root:xnu-10063.101.17~1/RELEASE_X86_64 x86_64 i386 Darwin

Subsystem

assert

What steps will reproduce the bug?
  1. Create an empty file with thousands of columns, e.g. 900,000 ;'s
  2. Append require('node:assert')(null)
  3. getErrMessage, specifically findColumn feeding into acorn takes several minutes
How often does it reproduce? Is there a required condition?

We've experienced this in production a number of times but we were never able to figure out what the problem was. We ship minified code to AWS Lambda and utilize the assert module for, well, runtime assertions. We were seeing unexplainable timeouts whenever a falsy case was hit.

It was luck that we found this in our test suite because we ran it through Terser by mistake.

What is the expected behavior? Why is that the expected behavior?

I'd expect the column search to be much faster, closer to something in the sub second/milliseconds range.

What do you see instead?

It takes minutes to construct the assertion error message.

It looks like a subset of the code may be passed to acorn (https://github.com/nodejs/node/blob/main/lib/assert.js#L232) leading to syntax errors as it parses till the end (https://github.com/nodejs/node/blob/main/lib/assert.js#L265), acorn then reports that error whenever it hits that point (https://github.com/nodejs/node/blob/main/lib/assert.js#L278), findColumn then continues to the next token and reads more chunks if necessary and acorn starts from scratch.

A bundler like Webpack emits an IIFE which itself contains an immediate block. I believe that is the majority of time spent for acorn traversing each token in it. I suspect the many errors come from that very block that is incomplete, so acorn wastes time trying to parse something that is known to be incomplete.

I think a better regression to the reproduction section is to do an IIFE and drop semi colons in there: (() => {;;;;;;;...;;;;;;require('node:assert')(null);})(). Interestingly enough, an IIFE around it is not affected by it.

Another interesting thing is that this does not affect normal Error's - is there a particular reason why they run on two different implementations?

Additional information
Screenshot 2024-04-24 at 23 33 35

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.