Kagiso Rabada claimed a six-wicket haul on Thursday as South Africa bowled Sri Lanka out for 224 in their second innings to win the second test by 282 runs with a day and a half to spare and take an unassailable 2-0 lead in the three-match series.
Sri Lanka failed to last the first session of the fourth day at Newlands, having resumed on 130-4 and being dismissed after just over 100 minutes of play.
They added 94 runs for their final six wickets to fold easily after being set a huge 507-run target on Wednesday.
"We have been relentless, never letting Sri Lanka into the game. We really stood up at key moments of the game," said South Africa captain Faf du Plessis.
The 21-year-old Rabada, who finished with figures of 6-55 and a second 10-wicket haul in a test, ran through the visiting batsmen in a fiery seven-over spell, first having Dinesh Chandimal (30) caught as he flicked the ball up to Stephen Cook at short leg.
Upul Tharanga was next to go as he swung the bat through a brief knock of 12 runs off seven balls, perishing when he got a bottom edge through to wicketkeeper Quinton de Kock.
Rabada, having taken two overnight, then claimed his fifth wicket of the innings, surprising captain Angelo Mathews with some extra bounce and finding the edge of the bat for De Kock to take another catch. Mathews went for 49, the top Sri Lankan score of the test.
Suranga Lakmal (10) was next as a rising delivery from Rabada brushed his glove on the way through to De Kock. Rangana Herath and Lahiru Kumara showed some resistance for the ninth wicket before quick glove work had Kumara stumped off Keshav Maharaj for nine.
Nuwan Pradeep was bowled by Vernon Philander to end the match, leaving Herath not out on 35.
"I felt my rhythm was a little off in the first innings but then it all clicked in the second innings and it all just got a lot better," Rabada told reporters.
South Africa dominated the test, save for the first session on the opening day, scoring 392 in their first innings with Dean Elgar and De Kock both getting centuries.
Philander and Rabada then took four wickets each as Sri Lanka were bowled out for 110 in reply but South Africa did not enforce the follow on, batting again instead and declaring midway through the third day on 224-7.
South Africa won the first test in Port Elizabeth by 206 runs and will be seeking a whitewash of the series in the third test at the Wanderers in Johannesburg from Jan. 12-16.
"It's obviously disappointing to make the same mistakes in a second successive test match. The batsmen let the bowlers down," said Sri Lanka captain Mathews.