Asynchronous Code Refactoring via Weighted Topological Sorting

Resolve Bottlenecks,
Find Innovative Solutions
Generate Solutions

Solution Overview

Problem

Existing software development tools often inefficiently handle asynchronous programming, leading to performance bottlenecks due to the placement of 'await' keywords in program code, which can significantly impact execution time, especially for less experienced developers.

Innovation Solution

An automated tool analyzes and refactors asynchronous code by converting 'await' statements into task variables, extracting awaits from loops, and repositioning them for optimal execution using weighted topological sorting, resulting in logically equivalent but more efficient code.

Engineering Contradictions & Design Principles

VSEngineering Contradiction Analysis

1Ease of operation

If await statements are placed early in the code for simplicity, then code readability is improved, but execution time increases due to unnecessary waiting

Engineering Contradiction:
Improvecode readabilityVSAvoidexecution time
Core Design Contradiction:
Ease of operationVSLoss of time

Solution Approach 1:

The patent applies preliminary action by analyzing the code structure before execution and pre-determining the optimal placement of await statements. The dependency graph analysis and topological sorting are performed in advance to identify where awaits should be positioned to minimize waiting time while maintaining code readability, thus resolving the contradiction between ease of operation and time loss.

Inventive Principle:
Principle #10Preliminary action

2Productivity

If await statements are extracted from loops for optimization, then execution efficiency is improved, but code complexity increases

Engineering Contradiction:
Improveexecution efficiencyVSAvoidcode complexity
Core Design Contradiction:
ProductivityVSDevice complexity

Solution Approach 1:

The patent applies the extraction principle by identifying await statements within loops and extracting them to appropriate positions outside the loop structure. The dependency graph analysis determines which awaits can be safely extracted without altering program logic, thereby improving execution efficiency by reducing redundant waiting while managing code complexity through systematic extraction rules.

Inventive Principle:
Principle #2Taking out (Extraction)

3Loss of time

If automated refactoring is applied to optimize await placement, then execution time is reduced, but tool complexity increases

Engineering Contradiction:
Improveawait waiting timeVSAvoidrefactoring tool complexity
Core Design Contradiction:
Loss of timeVSDevice complexity

Solution Approach 1:

The patent applies self-service by designing the refactoring tool to automatically analyze code dependencies, generate optimization suggestions, and apply refactoring without requiring complex manual configuration. The tool services itself by using the same dependency analysis algorithms to both identify optimization opportunities and verify their correctness, reducing the need for external validation mechanisms and simplifying the overall system complexity.

Inventive Principle:
Principle #25Self-service

Data Source

PatentUS10157055B2Code refactoring mechanism for asynchronous code optimization using topological sorting
Publication Date: 2018.12.18 MICROSOFT TECHNOLOGY LICENSING LLC
  • US10157055B2 patent drawing
  • US10157055B2 patent drawing
  • US10157055B2 patent drawing

AI summary

Methods, systems, apparatuses, and computer program products are provided for transforming asynchronous code into more efficient, logically equivalent asynchronous code; Program code is converted into a first syntax tree. A dependency graph is generated from the first syntax tree with each node of the dependency graph corresponding to a code statement and having an assigned weight. Weighted topological sorting of the dependency graph is performed to generate a sorted dependency graph. A second syntax tree is generated from the sorted dependency graph. In another implementation, the program code is transformed into await-relaxed and/or loop-relaxed program code prior to being transformed into the first syntax tree.