Skip to content

Commit 390cb97

Browse files
committed
perf: avoid quadratic behavior when combining line coverage
1 parent d3caf53 commit 390cb97

File tree

1 file changed

+27
-26
lines changed

1 file changed

+27
-26
lines changed

coverage/sqldata.py

+27-26
Original file line numberDiff line numberDiff line change
@@ -767,45 +767,46 @@ def update(self, other_data: CoverageData, aliases: PathAliases | None = None) -
767767
# Prepare arc and line rows to be inserted by converting the file
768768
# and context strings with integer ids. Then use the efficient
769769
# `executemany()` to insert all rows at once.
770-
arc_rows = (
771-
(file_ids[file], context_ids[context], fromno, tono)
772-
for file, context, fromno, tono in arcs
773-
)
774770

775771
# Get line data.
776-
with con.execute(
777-
"select file.path, context.context, line_bits.numbits " +
778-
"from line_bits " +
779-
"inner join file on file.id = line_bits.file_id " +
780-
"inner join context on context.id = line_bits.context_id",
781-
) as cur:
782-
for path, context, numbits in cur:
783-
key = (aliases.map(path), context)
784-
if key in lines:
785-
numbits = numbits_union(lines[key], numbits)
786-
lines[key] = numbits
772+
if lines:
773+
self._choose_lines_or_arcs(lines=True)
774+
775+
with con.execute(
776+
"select file.path, context.context, line_bits.numbits " +
777+
"from line_bits " +
778+
"inner join file on file.id = line_bits.file_id " +
779+
"inner join context on context.id = line_bits.context_id",
780+
) as cur:
781+
for path, context, numbits in cur:
782+
key = (aliases.map(path), context)
783+
if key in lines:
784+
lines[key] = numbits_union(lines[key], numbits)
785+
786+
con.executemany_void(
787+
"insert or replace into line_bits " +
788+
"(file_id, context_id, numbits) values (?, ?, ?)",
789+
[
790+
(file_ids[file], context_ids[context], numbits)
791+
for (file, context), numbits in lines.items()
792+
],
793+
)
787794

788795
if arcs:
789796
self._choose_lines_or_arcs(arcs=True)
790797

798+
arc_rows = (
799+
(file_ids[file], context_ids[context], fromno, tono)
800+
for file, context, fromno, tono in arcs
801+
)
802+
791803
# Write the combined data.
792804
con.executemany_void(
793805
"insert or ignore into arc " +
794806
"(file_id, context_id, fromno, tono) values (?, ?, ?, ?)",
795807
arc_rows,
796808
)
797809

798-
if lines:
799-
self._choose_lines_or_arcs(lines=True)
800-
con.execute_void("delete from line_bits")
801-
con.executemany_void(
802-
"insert into line_bits " +
803-
"(file_id, context_id, numbits) values (?, ?, ?)",
804-
[
805-
(file_ids[file], context_ids[context], numbits)
806-
for (file, context), numbits in lines.items()
807-
],
808-
)
809810
con.executemany_void(
810811
"insert or ignore into tracer (file_id, tracer) values (?, ?)",
811812
((file_ids[filename], tracer) for filename, tracer in tracer_map.items()),

0 commit comments

Comments
 (0)