【问题标题】:Different memory usage between compiled typescript and vanilla javascript编译的 typescript 和 vanilla javascript 之间的不同内存使用情况
【发布时间】:2019-09-06 13:33:38
【问题描述】:

当我编译我的 typescript 代码时,它与 vanilla javascript 代码完全相同,当代码运行直到崩溃时,我的内存使用量增加了。 vanilla javascript 代码的内存使用量始终保持不变。

代码连接到一个 mqtt 代理,然后读入一个文件并将文件中的每一行作为 mqtt 消息发布。

打字稿代码:

import { createReadStream } from 'fs'
import { split, mapSync } from 'event-stream'
import { connect } from 'mqtt'

const client = connect('mqtt://localhost:1883')

client.on('connect', () => {
  let lineNr = 0
  const stream = createReadStream('<PATH_TO_LARGE_FILE>')
    .pipe(split())
    .pipe(mapSync(async line => {

      // pause the readstream
      stream.pause()

      lineNr++

      if(lineNr % 1000 === 0)
        console.log(`${lineNr}\t${process.memoryUsage().heapTotal / 1048576}`)


      await new Promise((resolve, reject) => {
        client.publish('/standardized', line.toString(), () => {
          resolve()
        })
      })

      stream.resume()
    })
      .on('error', function(err){
        console.log('Error while reading file.', err)
        stream.destroy()
      })
      .on('end', function(){
        console.log('Read entire file')
        stream.destroy()
      })
    )
})

原版 Javascript:

const { createReadStream } = require('fs')
const { split, mapSync } = require('event-stream')
const { connect } = require('mqtt')

const client = connect('mqtt://localhost:1883')

client.on('connect', () => {
  let lineNr = 0
  const stream = createReadStream('<PATH_TO_LARGE_FILE>')
    .pipe(split())
    .pipe(mapSync(async line => {

      // pause the readstream
      stream.pause()

      lineNr++

      if(lineNr % 1000 === 0)
        console.log(`${lineNr}\t${process.memoryUsage().heapTotal / 1048576}`)


      await new Promise((resolve, reject) => {
        client.publish('/standardized', line.toString(), () => {
          resolve()
        })
      })

      stream.resume()
    })
      .on('error', function(err){
        console.log('Error while reading file.', err)
        stream.destroy()
      })
      .on('end', function(){
        console.log('Read entire file')
        stream.destroy()
      })
    )
})

预期:编译后的打字稿代码的内存使用量也应该保持不变 实际:编译后的打字稿代码的内存使用量会增加,直到代码崩溃

【问题讨论】:

  • 您是否检查了生成的 JavaScript 代码(Typescript 转译器编写的代码)是否存在差异?
  • 正如@Pointy 所说,将编译后的 TypeScript 与 vanilla JavaScript 进行比较。对于现代目标,编译后的 TypeScript 看起来几乎与您的 JavaScript 相同。所以我猜你正在使用一个不支持异步/等待的“旧”目标,这意味着 TypeScript 注入了一个使用更多内存的 polyfill。
  • 如果您有机会使用ts-node 之类的东西或其他方式在运行时编译您的 ts,那么这可能是您的问题的原因。那么你首先要做的就是手动编译你的ts,直接使用生成的js,看看内存是否还在泄漏。

标签: javascript node.js typescript mqtt


【解决方案1】:

得到它的工作,它确实是一个“错误”的 tsconfig(其中有目标:“es6”,将其更改为“ESNext”)。谢谢大家的cmets!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多