Automata synchronization has many important applications, mostly in conformance testing of electrical circuits, self-correcting codes and protocol testing. Finding a shortest synchronizing word cannot be done in polynomial time, assuming P not equal NP. In some situations, especially for very large automata, finding such a word is almost impossible. Therefore, we accept any synchronizing word that is reasonably short and can be calculated in short time. The existing algorithms are either polynomial (quick, but not optimal) or exponential (exact, but useless in case of large automata). In this paper we present a flexible algorithmic framework for synchronization. It allows the user to parameterize the algorithm to obtain a desired balance in terms of a trade-off between memory usage, runtime and optimality. We also discuss many practical issues that affect efficiency of an implementation. In particular, we design a new polynomial backward algorithm, which works significantly better than previously used heuristic algorithms. Finally, we present detailed results of experiments involving automata up to 2000 states, which compare our algorithms in various settings and the other known algorithms, and check the impact of different parameters on the results. (C) 2015 Elsevier Ltd. All rights reserved.