diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts index be3e13ede..acc372264 100644 --- a/lib/base-compiler.ts +++ b/lib/base-compiler.ts @@ -1966,7 +1966,7 @@ export class BaseCompiler implements ICompiler { inputFilename: inputFilename, dirPath: dirPath, executableFilename: this.getExecutableFilename(dirPath, this.outputFilebase, key), - packageDownloadAndUnzipTime: ((endTime - startTime) / BigInt(1000000)).toString(), + packageDownloadAndUnzipTime: utils.deltaTimeNanoToMili(startTime, endTime), }); } logger.debug('Tried to get executable from cache, but got a cache miss'); @@ -2904,10 +2904,7 @@ export class BaseCompiler implements ICompiler { const result = await this.env.cacheGet(key as any); if (result) { const cacheRetrieveTimeEnd = process.hrtime.bigint(); - result.retreivedFromCacheTime = ( - (cacheRetrieveTimeEnd - cacheRetrieveTimeStart) / - BigInt(1000000) - ).toString(); + result.retreivedFromCacheTime = utils.deltaTimeNanoToMili(cacheRetrieveTimeStart, cacheRetrieveTimeEnd); result.retreivedFromCache = true; if (doExecute) { const queueTime = performance.now(); diff --git a/lib/buildenvsetup/buildenv.interfaces.ts b/lib/buildenvsetup/buildenv.interfaces.ts index 4c726662d..30a3abc58 100644 --- a/lib/buildenvsetup/buildenv.interfaces.ts +++ b/lib/buildenvsetup/buildenv.interfaces.ts @@ -1,5 +1,5 @@ export type BuildEnvDownloadInfo = { step: string; packageUrl: string; - time: string; + time: number; }; diff --git a/lib/buildenvsetup/ceconan.ts b/lib/buildenvsetup/ceconan.ts index e76570e7c..ee314378d 100644 --- a/lib/buildenvsetup/ceconan.ts +++ b/lib/buildenvsetup/ceconan.ts @@ -35,10 +35,10 @@ import {CompilerInfo} from '../../types/compiler.interfaces.js'; import {CompilationEnvironment} from '../compilation-env.js'; import {logger} from '../logger.js'; import {VersionInfo} from '../options-handler.js'; +import * as utils from '../utils.js'; import {BuildEnvSetupBase} from './base.js'; import type {BuildEnvDownloadInfo} from './buildenv.interfaces.js'; -// import { CompilationEnvironment } from '../compilation-env.js'; export type ConanBuildProperties = { os: string; @@ -189,7 +189,7 @@ export class BuildEnvSetupCeConanDirect extends BuildEnvSetupBase { resolve({ step: `Download of ${libId} ${version}`, packageUrl: packageUrl, - time: ((endTime - startTime) / BigInt(1000000)).toString(), + time: utils.deltaTimeNanoToMili(startTime, endTime), }); }); diff --git a/lib/compilers/assembly.ts b/lib/compilers/assembly.ts index b6aaa601e..1d9fa9ed6 100644 --- a/lib/compilers/assembly.ts +++ b/lib/compilers/assembly.ts @@ -128,7 +128,7 @@ export class AssemblyCompiler extends BaseCompiler { okToCache: false, filenameTransform: (fn: string) => fn, stdout: [], - execTime: '', + execTime: 0, timedOut: false, compilationOptions: [], }; diff --git a/lib/compilers/rga.ts b/lib/compilers/rga.ts index 0637b34db..d9a21857f 100644 --- a/lib/compilers/rga.ts +++ b/lib/compilers/rga.ts @@ -35,6 +35,7 @@ import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.in import {BaseCompiler} from '../base-compiler.js'; import * as exec from '../exec.js'; import {logger} from '../logger.js'; +import * as utils from '../utils.js'; interface ASICSelection { asic?: string; @@ -101,10 +102,6 @@ Please supply an ASIC from the following options:`, }; } - execTime(startTime: bigint, endTime: bigint): string { - return ((endTime - startTime) / BigInt(1000000)).toString(); - } - override async runCompiler( compiler: string, options: string[], @@ -153,7 +150,7 @@ Please supply an ASIC from the following options:`, okToCache: true, filenameTransform: (x: string) => x, stdout: asicSelection.error, - execTime: this.execTime(startTime, endTime), + execTime: utils.deltaTimeNanoToMili(startTime, endTime), }; } @@ -161,7 +158,7 @@ Please supply an ASIC from the following options:`, if (dxcResult.code !== 0) { // Failed to compile SPIR-V intermediate product. Exit immediately with DXC invocation result. const endTime = process.hrtime.bigint(); - dxcResult.execTime = this.execTime(startTime, endTime); + dxcResult.execTime = utils.deltaTimeNanoToMili(startTime, endTime); return dxcResult; } @@ -174,7 +171,7 @@ Please supply an ASIC from the following options:`, okToCache: true, filenameTransform: (x: string) => x, stdout: 'Failed to emit intermediate SPIR-V result.', - execTime: this.execTime(startTime, endTime), + execTime: utils.deltaTimeNanoToMili(startTime, endTime), }; } @@ -196,7 +193,7 @@ Please supply an ASIC from the following options:`, if (rgaResult.code !== 0) { // Failed to compile AMD ISA const endTime = process.hrtime.bigint(); - rgaResult.execTime = this.execTime(startTime, endTime); + rgaResult.execTime = utils.deltaTimeNanoToMili(startTime, endTime); return rgaResult; } @@ -263,14 +260,14 @@ where [ASIC] corresponds to one of the following options:`; } const endTime = process.hrtime.bigint(); - rgaResult.execTime = this.execTime(startTime, endTime); + rgaResult.execTime = utils.deltaTimeNanoToMili(startTime, endTime); return rgaResult; } } // Arriving here means the expected ISA result wasn't emitted. Synthesize an error. const endTime = process.hrtime.bigint(); - rgaResult.execTime = this.execTime(startTime, endTime); + rgaResult.execTime = utils.deltaTimeNanoToMili(startTime, endTime); rgaResult.stdout += `\nRGA didn't emit expected ISA output.`; return rgaResult; } diff --git a/lib/exec.ts b/lib/exec.ts index 1534f60c9..004e332ea 100644 --- a/lib/exec.ts +++ b/lib/exec.ts @@ -39,6 +39,7 @@ import {assert, unwrap, unwrapString} from './assert.js'; import {logger} from './logger.js'; import {Graceful} from './node-graceful.js'; import {propsFor} from './properties.js'; +import * as utils from './utils.js'; type NsJailOptions = { args: string[]; @@ -174,7 +175,7 @@ export function executeDirect( stdout: streams.stdout, stderr: streams.stderr, truncated: streams.truncated, - execTime: ((endTime - startTime) / BigInt(1000000)).toString(), + execTime: utils.deltaTimeNanoToMili(startTime, endTime), }; // Check debug level explicitly as result may be a very large string // which we'd prefer to avoid preparing if it won't be used diff --git a/lib/execution/base-execution-env.ts b/lib/execution/base-execution-env.ts index fb70cff7b..891ef8543 100644 --- a/lib/execution/base-execution-env.ts +++ b/lib/execution/base-execution-env.ts @@ -118,7 +118,7 @@ export class LocalExecutionEnvironment implements IExecutionEnvironment { inputFilename: inputFilename, dirPath: dirPath, executableFilename: executableFilename, - packageDownloadAndUnzipTime: ((endTime - startTime) / BigInt(1000000)).toString(), + packageDownloadAndUnzipTime: utils.deltaTimeNanoToMili(startTime, endTime), }); } else { throw new ExecutablePackageCacheMiss('Tried to get executable from cache, but got a cache miss'); diff --git a/lib/parsers/asm-parser-beebasm.ts b/lib/parsers/asm-parser-beebasm.ts index 32169360d..3597f7fb4 100644 --- a/lib/parsers/asm-parser-beebasm.ts +++ b/lib/parsers/asm-parser-beebasm.ts @@ -14,7 +14,7 @@ export class AsmParserBeebAsm extends AsmParser { this.asmOpcodeRe = /^\s*(?
[\dA-F]+)\s*(?([\dA-F]{2} ?)+)\s*(?.*)/; } - override processAsm(asm: string, filters: ParseFiltersAndOutputOptions): ParsedAsmResult { + override processAsm(asm: string, _filters: ParseFiltersAndOutputOptions): ParsedAsmResult { const startTime = process.hrtime.bigint(); const asmLines: ParsedAsmResultLine[] = []; @@ -52,7 +52,7 @@ export class AsmParserBeebAsm extends AsmParser { return { asm: asmLines, labelDefinitions: labelDefinitions, - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: startingLineCount - asm.length, }; } diff --git a/lib/parsers/asm-parser-cpp.ts b/lib/parsers/asm-parser-cpp.ts index bd173d15a..b01a659cf 100644 --- a/lib/parsers/asm-parser-cpp.ts +++ b/lib/parsers/asm-parser-cpp.ts @@ -71,7 +71,7 @@ export class AsmParserCpp implements IAsmParser { return { asm: asm, labelDefinitions: {}, - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: 0, }; } diff --git a/lib/parsers/asm-parser-dart.ts b/lib/parsers/asm-parser-dart.ts index e24888e22..642e16c1c 100644 --- a/lib/parsers/asm-parser-dart.ts +++ b/lib/parsers/asm-parser-dart.ts @@ -168,7 +168,7 @@ export class DartAsmParser extends AsmParser { return { asm: asm, labelDefinitions: labelDefinitions, - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: startingLineCount - asm.length, }; } diff --git a/lib/parsers/asm-parser-dotnet.ts b/lib/parsers/asm-parser-dotnet.ts index a576f26e4..c87f6456f 100644 --- a/lib/parsers/asm-parser-dotnet.ts +++ b/lib/parsers/asm-parser-dotnet.ts @@ -22,6 +22,7 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. +import {ParsedAsmResult} from '../../types/asmresult/asmresult.interfaces.js'; import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import * as utils from '../utils.js'; @@ -133,7 +134,7 @@ export class DotNetAsmParser implements IAsmParser { return cleanedAsm; } - process(asmResult: string, filters: ParseFiltersAndOutputOptions) { + process(asmResult: string, filters: ParseFiltersAndOutputOptions): ParsedAsmResult { const startTime = process.hrtime.bigint(); const asm: { @@ -198,7 +199,7 @@ export class DotNetAsmParser implements IAsmParser { return { asm: asm, labelDefinitions: Object.fromEntries(labelDefinitions.filter(i => i[1] !== -1)), - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: startingLineCount - asm.length, }; } diff --git a/lib/parsers/asm-parser-mads.ts b/lib/parsers/asm-parser-mads.ts index 2a70f7efc..8bd6ce019 100644 --- a/lib/parsers/asm-parser-mads.ts +++ b/lib/parsers/asm-parser-mads.ts @@ -232,7 +232,7 @@ export class MadsAsmParser extends AsmParser { return { asm: asm, labelDefinitions: labelDefinitions, - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: startingLineCount - asm.length, languageId: 'asm6502', }; diff --git a/lib/parsers/asm-parser-spirv.ts b/lib/parsers/asm-parser-spirv.ts index 209edf5ea..dd609801c 100644 --- a/lib/parsers/asm-parser-spirv.ts +++ b/lib/parsers/asm-parser-spirv.ts @@ -22,7 +22,7 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. -import {AsmResultLabel, ParsedAsmResultLine} from '../../types/asmresult/asmresult.interfaces.js'; +import {AsmResultLabel, ParsedAsmResult, ParsedAsmResultLine} from '../../types/asmresult/asmresult.interfaces.js'; import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import * as utils from '../utils.js'; @@ -85,7 +85,7 @@ export class SPIRVAsmParser extends AsmParser { return labelsInLine; } - override processAsm(asmResult, filters: ParseFiltersAndOutputOptions) { + override processAsm(asmResult, filters: ParseFiltersAndOutputOptions): ParsedAsmResult { const startTime = process.hrtime.bigint(); const asm: ParsedAsmResultLine[] = []; @@ -183,7 +183,7 @@ export class SPIRVAsmParser extends AsmParser { asm: asm, labelDefinitions, languageId: 'spirv', - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: startingLineCount - asm.length, }; } diff --git a/lib/parsers/asm-parser-z88dk.ts b/lib/parsers/asm-parser-z88dk.ts index 460942e8d..5672fcf46 100644 --- a/lib/parsers/asm-parser-z88dk.ts +++ b/lib/parsers/asm-parser-z88dk.ts @@ -188,7 +188,7 @@ export class AsmParserZ88dk extends AsmParser { return { asm: asm, labelDefinitions: labelDefinitions, - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: startingLineCount - asm.length, }; } @@ -260,7 +260,7 @@ export class AsmParserZ88dk extends AsmParser { return { asm: asm, labelDefinitions: labelDefinitions, - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: startingLineCount - asm.length, }; } diff --git a/lib/parsers/asm-parser.ts b/lib/parsers/asm-parser.ts index 314e57e37..70034d264 100644 --- a/lib/parsers/asm-parser.ts +++ b/lib/parsers/asm-parser.ts @@ -673,7 +673,7 @@ export class AsmParser extends AsmRegex implements IAsmParser { return { asm: asm, labelDefinitions: labelDefinitions, - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: startingLineCount - asm.length, }; } @@ -829,7 +829,7 @@ export class AsmParser extends AsmRegex implements IAsmParser { return { asm: asm, labelDefinitions: labelDefinitions, - parsingTime: ((endTime - startTime) / BigInt(1000000)).toString(), + parsingTime: utils.deltaTimeNanoToMili(startTime, endTime), filteredCount: startingLineCount - asm.length, }; } diff --git a/lib/utils.ts b/lib/utils.ts index 858403b0e..f97c19fe3 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -533,7 +533,11 @@ export function getEmptyExecutionResult(): BasicExecutionResult { filenameTransform: x => x, stdout: [], stderr: [], - execTime: '', + execTime: 0, timedOut: false, }; } + +export function deltaTimeNanoToMili(startTime: bigint, endTime: bigint): number { + return Number((endTime - startTime) / BigInt(1_000_000)); +} diff --git a/test/asm-tests.ts b/test/asm-tests.ts index 715e948f2..eea8679b2 100644 --- a/test/asm-tests.ts +++ b/test/asm-tests.ts @@ -200,7 +200,7 @@ ${' '.repeat(65530)}x ret `; const output = parser.process(asm, filters); - expect(parseInt(unwrap(output.parsingTime))).toBeLessThan(500); // reported as ms, generous timeout for ci runner + expect(unwrap(output.parsingTime)).toBeLessThan(500); // reported as ms, generous timeout for ci runner }); }); @@ -229,6 +229,6 @@ ${' '.repeat(65530)}x ret `; const output = parser.process(asm, filters); - expect(parseInt(unwrap(output.parsingTime))).toBeLessThan(500); // reported as ms, generous timeout for ci runner + expect(unwrap(output.parsingTime)).toBeLessThan(500); // reported as ms, generous timeout for ci runner }); }); diff --git a/types/asmresult/asmresult.interfaces.ts b/types/asmresult/asmresult.interfaces.ts index d401cfb09..8787d4075 100644 --- a/types/asmresult/asmresult.interfaces.ts +++ b/types/asmresult/asmresult.interfaces.ts @@ -34,12 +34,11 @@ export type ParsedAsmResultLine = { export type ParsedAsmResult = { asm: ParsedAsmResultLine[]; labelDefinitions?: Record; - parsingTime?: string; + parsingTime?: number; filteredCount?: number; externalParserUsed?: boolean; - // TODO(#4655) A few compilers seem to assign strings here. It might be ok but we should look into it more. - objdumpTime?: number | string; - execTime?: string; + objdumpTime?: number; + execTime?: number; languageId?: string; }; diff --git a/types/compilation/compilation.interfaces.ts b/types/compilation/compilation.interfaces.ts index 28b61e286..aaa0e07b5 100644 --- a/types/compilation/compilation.interfaces.ts +++ b/types/compilation/compilation.interfaces.ts @@ -216,7 +216,7 @@ export type CompilationResult = { retreivedFromCache?: boolean; retreivedFromCacheTime?: number; packageDownloadAndUnzipTime?: number; - execTime?: number | string; + execTime?: number; processExecutionResultTime?: number; objdumpTime?: number; parsingTime?: number; diff --git a/types/execution/execution.interfaces.ts b/types/execution/execution.interfaces.ts index b28455e3d..a9746bfcb 100644 --- a/types/execution/execution.interfaces.ts +++ b/types/execution/execution.interfaces.ts @@ -8,7 +8,7 @@ export type UnprocessedExecResult = { filenameTransform: FilenameTransformFunc; stdout: string; stderr: string; - execTime: string; + execTime: number; timedOut: boolean; languageId?: string; truncated: boolean; @@ -26,7 +26,7 @@ export type BasicExecutionResult = { filenameTransform: FilenameTransformFunc; stdout: ResultLine[]; stderr: ResultLine[]; - execTime: string; + execTime: number; processExecutionResultTime?: number; timedOut: boolean; languageId?: string;