South Africa wrapped up victory by an innings and 45 runs shortly after lunch on the fourth day of the first Test against Sri Lanka at SuperSport Park in Centurion on Tuesday.
Sri Lanka, needing 225 runs to avoid an innings defeat, were bowled out for 180.
Kusal Perera hit a spirited 64 off 87 balls for the tourists and debutant Wanindu Hasaranga slammed 59 off 53 balls, taking advantage as South Africa seemingly tried to lift their over-rate by rushing through six overs of slow bowling after lunch.
Sri Lanka resumed at 65-2 on Tuesday but never recovered after all-rounder Wiaan Mulder dismissed overnight batsman Dinesh Chandimal and Niroshan Dickwella in quick succession.
Batsman Dhananjaya de Silva, who retired hurt after making 79 in the first innings, did not bat for Sri Lanka. He was ruled out of the rest of the tour with a torn thigh muscle.
Sri Lanka suffered a spate of injuries during the match but bowlers Kasun Rajitha and Lahiru Kumara hobbled to the crease to delay the inevitable. Both suffered groin injuries while bowling.
Sri Lanka started the match well, making 396 after winning the toss but an injury-depleted bowling attack conceded 621 runs when South Africa batted, with former captain Faf du Plessis hitting 199. Du Plessis was named man of the match.
It was South Africa's second win in eight matches in the world Test championship. They have suffered six defeats. Sri Lanka have won one, lost three and drawn one of their five matches.
Chandimal, who appeared to suffer a groin injury towards the end of Monday's play, resumed his innings on Tuesday and survived for 40 minutes before being bowled for 25 by a ball from the medium-paced Mulder which cut back off the pitch.
Mulder, 22, followed up by having Niroshan Dickwella caught behind. He provided the control that was missing from much of South Africa's bowling in the first innings during a spell of two for 29 in nine overs.
Fast bowler Anrich Nortje had the left-handed Perera caught behind off a faint edge, with South Africa successfully reviewing what was originally a not-out decision. Perera hit 10 fours.