Skip to content

Commit 4a43dfe

Browse files
authored
Performance optimization on queueStore (#521)
* Eager calculate flat outputs * Optimize flat tasks performance
1 parent 8576d37 commit 4a43dfe

File tree

1 file changed

+49
-26
lines changed

1 file changed

+49
-26
lines changed

src/stores/queueStore.ts

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import type {
99
TaskOutput,
1010
ResultItem
1111
} from '@/types/apiTypes'
12-
import { validateTaskItem } from '@/types/apiTypes'
1312
import type { NodeId } from '@/types/comfyWorkflow'
1413
import { instanceToPlain, plainToClass } from 'class-transformer'
1514
import _ from 'lodash'
@@ -51,18 +50,33 @@ export class ResultItemImpl {
5150
}
5251

5352
export class TaskItemImpl {
54-
taskType: TaskType
55-
prompt: TaskPrompt
56-
status?: TaskStatus
57-
outputs: TaskOutput
53+
readonly taskType: TaskType
54+
readonly prompt: TaskPrompt
55+
readonly status?: TaskStatus
56+
readonly outputs: TaskOutput
57+
readonly flatOutputs: ReadonlyArray<ResultItemImpl>
58+
59+
constructor(
60+
taskType: TaskType,
61+
prompt: TaskPrompt,
62+
status: TaskStatus | undefined,
63+
outputs: TaskOutput,
64+
flatOutputs?: ReadonlyArray<ResultItemImpl>
65+
) {
66+
this.taskType = taskType
67+
this.prompt = prompt
68+
this.status = status
69+
this.outputs = outputs
70+
this.flatOutputs = flatOutputs ?? this.calculateFlatOutputs()
71+
}
5872

59-
get flatOutputs(): ResultItemImpl[] {
73+
private calculateFlatOutputs(): ReadonlyArray<ResultItemImpl> {
6074
if (!this.outputs) {
6175
return []
6276
}
6377
return Object.entries(this.outputs).flatMap(([nodeId, nodeOutputs]) =>
6478
Object.entries(nodeOutputs).flatMap(([mediaType, items]) =>
65-
(items as ResultItem[]).flatMap((item: ResultItem) =>
79+
(items as ResultItem[]).map((item: ResultItem) =>
6680
plainToClass(ResultItemImpl, {
6781
...item,
6882
nodeId,
@@ -230,22 +244,25 @@ export const useQueueStore = defineStore('queue', {
230244
return [task]
231245
}
232246

233-
return task.flatOutputs.map((output: ResultItemImpl, i: number) =>
234-
plainToClass(TaskItemImpl, {
235-
...instanceToPlain(task),
236-
prompt: [
237-
task.queueIndex,
238-
`${task.promptId}-${i}`,
239-
task.promptInputs,
240-
task.extraData,
241-
task.outputsToExecute
242-
],
243-
outputs: {
244-
[output.nodeId]: {
245-
[output.mediaType]: [instanceToPlain(output)]
246-
}
247-
}
248-
})
247+
return task.flatOutputs.map(
248+
(output: ResultItemImpl, i: number) =>
249+
new TaskItemImpl(
250+
task.taskType,
251+
[
252+
task.queueIndex,
253+
`${task.promptId}-${i}`,
254+
task.promptInputs,
255+
task.extraData,
256+
task.outputsToExecute
257+
],
258+
task.status,
259+
{
260+
[output.nodeId]: {
261+
[output.mediaType]: [output]
262+
}
263+
},
264+
[output]
265+
)
249266
)
250267
})
251268
},
@@ -263,9 +280,15 @@ export const useQueueStore = defineStore('queue', {
263280

264281
const toClassAll = (tasks: TaskItem[]): TaskItemImpl[] =>
265282
tasks
266-
.map((task) => validateTaskItem(task))
267-
.filter((result) => result.success)
268-
.map((result) => plainToClass(TaskItemImpl, result.data))
283+
.map(
284+
(task: TaskItem) =>
285+
new TaskItemImpl(
286+
task.taskType,
287+
task.prompt,
288+
task['status'],
289+
task['outputs'] || {}
290+
)
291+
)
269292
// Desc order to show the latest tasks first
270293
.sort((a, b) => b.queueIndex - a.queueIndex)
271294

0 commit comments

Comments
 (0)