>>647 Cで書いてみた。よければ測ってみてw

#include <stdlib.h>
#include <stdio.h>
int scomp(const void *a, const void *b) {
 return strcmp(*(char *const *)a, *(char *const *)b);
}
int main(int argc, char **argv) {
 int i, buffsize = 1024, datamaxsize = 1, datasize = 0;
 char **data = (char **)malloc(datamaxsize * sizeof(char *));
 char buff[buffsize], *p, *delim = "\r\n\t ", *saveptr, *last = "";
 FILE *in = 0 < argc ? fopen(argv[1], "r") : 0;
 if (in) while (fgets(buff, buffsize, in) != NULL) {
  for (p = strtok_r(buff, delim, &saveptr); p; p = strtok_r(0, delim, &saveptr)) {
   if (datamaxsize <= datasize) {
    datamaxsize *= 2;
    data = realloc(data, datamaxsize * sizeof(char *));
   }
   data[datasize++] = strdup(p);
  }
 }
 fclose(in);
 qsort(data, datasize, sizeof(char *), scomp);
 for (i = 0; i < datasize; i++) {
  if (strcmp(last, data[i]) != 0) puts(data[i]);
  last = data[i];
 }
 return 0;
}