Ran some performance tests:

```javascript
// test.js
const LEN = 1e6;

var buf = require('buffer').SlowBuffer(8);
var i;
buf.fill(0,0,8);

console.time('readFloatLE');
for (i = 0; i < LEN; i++)
  buf.readFloatLE(0);
console.timeEnd('readFloatLE');

// ... other three reads are pretty much the same
```

Tested against the following code snippets:

```c++
if (!non_native_endian)
  return Number::New(*reinterpret_cast<T*>(ptr));
char buf[sizeof(T)];
for (size_t i = 0; i < sizeof(T); i++)
  buf[i] = ptr[sizeof(T) - 1 - i];
return Number::New(*reinterpret_cast<T*>(buf));

// results:
// readFloatLE: 274ms
// readFloatBE: 339ms
// readDoubleLE: 285ms
// readDoubleBE: 408ms
```

```c++
memcpy(&val, ptr, sizeof(T));
if (non_native_endian)
  swizzle(reinterpret_cast<char*>(&val), sizeof(T));

// results:
// readFloatLE: 277ms
// readFloatBE: 277ms
// readDoubleLE: 282ms
// readDoubleBE: 288ms
```

I might have missed something in your implementation, but seems the current implementation is consistently faster.