Using Workload Characterization To Guide High Performance Graph Processing