Measuring Time Between Inputs
Currently your code is not working, because Arduino is fast enough to check the closed switch state many times before it opens again, so before calculating a new speed value, you need to see LOW on the input.

Still, there are at least 2 better ways to do what you want.

pulseIn() - a function intended just for what you are trying to do: measuring lenght of a pulses. If your switch is active HIGH, you need to measure length of a LOW pulse:

unsigned long duration;
duration = pulseIn(reed, LOW);
// calculate speed basing on duration (in microseconds)


Keep in mind, that pulseIn() is a blocking function, so no code will be executed, until it receives the pulse. You can counter it bu specifying a timeout, after which, the program will continue.

External interrupts are an another approach. Interrupt handling routines are executed when a specified event occurs, no matter if the microcontroller is busy doing something else or not. They would guarantee, that you will not miss any pulse even if they would have frequency in order of kHz.

volatile unsigned long lastTime = 0;

void setup() {
    attachInterrupt(0, readTime, RISING);
} 

void readTime() {
    unsigned long t = millis();
    // calculate speed basing on t - lastTime
    lastTime = t;
}


Interrupt handling routine should be as short as possible. Avoid using delays in it, doing Serial.print and other communications. Also, millis() and micros() will not increment during execution of interrupt handler.

Debouncing - even with above two methods, things may still not work properly. The most probable cause would be switch "bouncing". You can counter it by


software debouncing  - delaying after pulseIn() or ignoring interrupts for some period of time after first interrupt is detected
adding a small (10-100nF) capacitor at the input, that will act as a low-pass filter, cutting out short pulses
using not a reed switch, but a hall sensor with hysteresis