this really should be much faster, but I guess there's overhead