VideoCapture.read() using OpenCV. Why is USB Camera faster than CSI Camera? (NO GPU)

I am using NanoPi Duo 2 for the real-time image acquisition project.

I have noticed a significant performance (speed) difference between using CSI camera and USB camera.

The performance difference is as follows, Time for OpenCV VideoCapture.read()

CSI_OV5640_Camera = ~0.04s (40 ms) USB_Logitech_HD_C270 = ~0.009 (9 ms) 

As far as I know, I understand that NanoPi Duo2 does not have any GPU and CSI camera will be handled by CPU (Same as USB Camera).

Using $ htop both CSI and USB cameras shows 100% @ one of 4 cores.

For background,

OpenCV 3.4.6 Build Output

Video I/O  - libv4l/libv4l2    NO  - v4l/v4l2          linux/videodev2.h 

$ v4l2-ctl –get-fmt-video

Format Video Capture:         Width/Height      : 640/480         Pixel Format      : 'YV12'         Field             : Any         Bytes per Line    : 960         Size Image        : 460800         Colorspace        : Default         Transfer Function : Default         YCbCr Encoding    : Default         Quantization      : Default         Flags             : 

One interesting thing Performance of using numpy ndarray from CSI and USB are ALSO different

pyzbar.decode() calculation CSI_OV5640_Camera = ~0.43s (430 ms) USB_Logitech_HD_C270 = ~0.19s (190 ms) 

I am thinking that encoding of the VideoCapture.read() are different but all I see is same sized (640×480, 3 colors) numpy ndarray with similar looking values.

Thank you for reading my question.