A method of dynamically switching cores on a heterogeneous multi-core processing system comprising: executing program code on a first processing core of the heterogeneous multi-core processing system, wherein the first processing core comprises an out-of-order processing core including two hardware thread slots (101a, 101 b) and executes instructions out-of-order on the two hardware thread slots (101a, 101 b); monitoring performance and collecting statistics of the first processing core executing the program code; predicting, while the program code is executed on the first processing core, performance of executing the program code on a second processing core of the heterogeneous multi-core processing system based at least in part on the monitored performance and collected statistics of the first processing core executing the program code, the second processing core comprising an in-order processing core executing instructions in program order; and when the predicted performance of executing the program code on the second processing core is better than the performance of the first processing core executing the program code, switching execution of the program code from the first processing core to the second processing core; wherein predicting the performance of the second processing core comprises executing a plurality of code segments on both the first processing core and the second processing core, collecting the respective performance information and statistics of the first and second processing cores while executing the pieces of code, and determining a best fit function F such that differences between F, performance information and statistics of the first core, and the performance of the second processing core are minimized. executing program code on a first processing core of the heterogeneous multi-core processing system, wherein the first processing core comprises an out-of-order processing core including two hardware thread slots (101a, 101 b) and executes instructions out-of-order on the two hardware thread slots (101a, 101 b); monitoring performance and collecting statistics of the first processing core executing the program code; predicting, while the program code is executed on the first processing core, performance of executing the program code on a second processing core of the heterogeneous multi-core processing system based at least in part on the monitored performance and collected statistics of the first processing core executing the program code, the second processing core comprising an in-order processing core executing instructions in program order; and when the predicted performance of executing the program code on the second processing core is better than the performance of the first processing core executing the program code, switching execution of the program code from the first processing core to the second processing core; wherein predicting the performance of the second processing core comprises executing a plurality of code segments on both the first processing core and the second processing core, collecting the respective performance information and statistics of the first and second processing cores while executing the pieces of code, and determining a best fit function F such that differences between F, performance information and statistics of the first core, and the performance of the second processing core are minimized.