$subject = 'abc-def-xyz';
$results = preg_replace_callback ('/-(.)/', create_function('$matches','return strtoupper($matches[1]);'), $subject);
var_dump($results);
и
$subject = 'abcDefXyz';
$results = preg_replace_callback ('/([A-Z])/', create_function('$matches','return \'-\' . strtolower($matches[1]);'), $subject);
var_dump($results);
РЕДАКТИРОВАТЬ
Если вы хотите узнать, работает ли он быстрее, вам нужно профилировать его, чтобы определить, что