final romanNumbers = { "I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000 }; void main() { var stopwatch = Stopwatch()..start(); final int loopCount = 1000000; for(var i = 0; i < loopCount; i++) { romanToIntShamkhal('MCMXCIV'); } print('Shamkhal\'s Code Executed in ${stopwatch.elapsed}'); stopwatch = Stopwatch()..start(); for(var i = 0; i < loopCount; i++) { romanToIntKanan('MCMXCIV'); } print('Kanan\'s Code Executed in ${stopwatch.elapsed}'); } int romanToIntShamkhal(String roman) { return roman.split('') .reversed .map((n) => romanNumbers[n]) .reduce((curr, next) => curr > 2 * next ? curr - next : curr + next); } int romanToIntKanan(String romanNumber) { int calculatedResult = 0; for (int i = 0; i < romanNumber.length; i++) { var currentCharacter = new String.fromCharCode(romanNumber.runes.elementAt(i)); var nextCharacter; if (i < romanNumber.length - 1) { nextCharacter = new String.fromCharCode(romanNumber.runes.elementAt(i + 1)); } if (nextCharacter != null) { calculatedResult += romanNumbers[currentCharacter] * (romanNumbers[currentCharacter] >= romanNumbers[nextCharacter] ? 1 : -1); continue; } calculatedResult += romanNumbers[currentCharacter]; } return calculatedResult; }