http://stackoverflow.com/questions/15187017/reduce-computing-time-for-reshape/15187863

Here is an option using data.table 


    dtt <- data.table(data)

    # non value columns, ie, the columns to keep post reshape
    nvc <- c("Name","Code", "CURRENCY")

    # name of columns being transformed 
    dateCols <- setdiff(names(data), nvc)

    # use rbind list to combine subsets
    dtt2 <- rbindlist(lapply(dateCols, function(d) {
        dtt[, Date := d]
        cols <- c(nvc, "Date", d)
        setnames(dtt[, cols, with=FALSE], cols, c(nvc, "Date", "value"))
    }))

    ## Results: 

    dtt2
    #       Name Code CURRENCY         Date value
    # 1: Abengoa 4256      USD X_01_01_1980  1.53
    # 2:  Adidas 6783      USD X_01_01_1980  0.23
    # 3: Abengoa 4256      USD X_02_01_1980  1.54
    # 4:  Adidas 6783      USD X_02_01_1980  0.54
    # 5: ... <cropped>

--------

## Updated Benchmarks with larger sample data
As per the suggestion from @AnandaMahto, below are benchmarks using a large (larger) sample data. 
_Please feel free to modify the parameters and add additional benchmarks and/or methods_


### Benchmarks

     Resh <- quote(reshape::melt(data,id=c("Name","Code", "CURRENCY"),variable_name="Date"))
     Resh2 <- quote(reshape2::melt(data,id=c("Name","Code", "CURRENCY"),variable_name="Date"))
     DT <- quote({    nvc <- c("Name","Code", "CURRENCY"); dateCols <- setdiff(names(data), nvc); rbindlist(lapply(dateCols, function(d) { dtt[, Date := d]; cols <- c(nvc, "Date", d); setnames(dtt[, cols, with=FALSE], cols, c(nvc, "Date", "value"))}))})
     Stack <- quote(data.frame(data[1:3], stack(data[-c(1, 2, 3)])))

     # SAMPLE SIZE: ROWS = 900; COLS = 380 + 3; 
     dtt <- data.table(data);  
     benchmark(Resh=eval(Resh),Resh2=eval(Resh2),DT=eval(DT), Stack=eval(Stack), replications=5, columns=c("relative", "test", "elapsed", "user.self", "sys.self", "replications"), order="relative")
     # relative  test elapsed user.self sys.self replications
     #    1.000 Stack   0.813     0.623    0.192            5
     #    2.530    DT   2.057     2.035    0.026            5
     #   40.470  Resh  32.902    18.410   14.602            5
     #   40.578 Resh2  32.990    18.419   14.728            5

     # SAMPLE SIZE: ROWS = 2,700; COLS = 380 + 3; 
     dtt <- data.table(data);  
     benchmark(Resh2=eval(Resh2), DT=eval(DT), Stack=eval(Stack), replications=5, columns=c("relative", "test", "elapsed", "user.self", "sys.self", "replications"), order="relative")
     # relative  test elapsed user.self sys.self replications
     #    1.000 Stack   2.025     1.511    0.520            5
     #    1.216    DT   2.463     2.397    0.070            5
     #   46.050 Resh2  93.252    46.718   46.921            5

     # SAMPLE SIZE: ROWS = 3,500; COLS = 380 + 3; 
     dtt <- data.table(data);  
     benchmark(DT=eval(DT), Stack=eval(Stack), replications=5, columns=c("relative", "test", "elapsed", "user.self", "sys.self", "replications"), order="relative")
     #  relative  test elapsed user.self sys.self replications
     #      1.00    DT   2.407     2.336    0.076            5
     #      1.08 Stack   2.600     1.626    0.983            5

     # SAMPLE SIZE: ROWS = 27,000; COLS = 380 + 3; 
     dtt <- data.table(data);  
     benchmark(DT=eval(DT), Stack=eval(Stack), replications=5, columns=c("relative", "test", "elapsed", "user.self", "sys.self", "replications"), order="relative")
     # relative  test elapsed user.self sys.self replications
     #    1.000    DT  10.450     7.418    3.058            5
     #    2.232 Stack  23.329    14.180    9.266            5


### Sample Data Creation
      rm(list=ls(all=TRUE))
      set.seed(1)
      LLLL <- apply(expand.grid(LETTERS, LETTERS[10:15], LETTERS[1:20], LETTERS[1:5], stringsAsFactors=FALSE), 1, paste0, collapse="")
    
      size <- 3500
      dateSamples <- 380
      startDate <- as.Date("1980-01-01")

      Name <- apply(matrix(LLLL[1:(2*size)], ncol=2), 1, paste0, collapse="")
      Code <- sample(1e3:max(1e4-1, size+1e3), length(Name))
      CURRENCY <- sample(c("USD", "EUR", "YEN"), length(Name), TRUE)

      Dates <- seq(startDate, length.out=dateSamples, by="mon")
      Values <- sample(c(1:1e2, 1:5e2), size=size*dateSamples, TRUE) / 1e2

      # Calling the sample dataframe `data` to keep consistency, but I dont like this practice
      data <- data.frame(Name, Code, CURRENCY,       
                         matrix(Values, ncol=length(Dates), dimnames=list(c(), as.character(Dates)))
                        ) 
    
      data[1:12, 1:8]
      #        Name Code CURRENCY X1980.01.01 X1980.02.01 X1980.03.01 X1980.04.01 X1980.05.01
      # 1  AJAAQNFA 3389      YEN        0.37        0.33        3.58        4.33        1.06
      # 2  BJAARNFA 4348      YEN        1.14        2.69        2.57        0.27        3.02
      # 3  CJAASNFA 6154      USD        2.47        3.72        3.32        0.36        4.85
      # 4  DJAATNFA 9171      USD        2.22        2.48        0.71        0.79        2.85
      # 5  EJAAUNFA 2814      USD        2.63        2.17        1.66        0.55        3.12
      # 6  FJAAVNFA 9081      USD        1.92        1.47        3.51        3.23        3.68
      # 7  GJAAWNFA 9496      USD        0.79        3.39        4.61        1.40        1.52
      # 8  HJAAXNFA 6942      USD        4.79        4.31        0.43        0.72        1.77
      # 9  IJAAYNFA 6656      USD        3.46        0.69        1.34        0.59        0.73
      # 10 JJAAZNFA 1555      USD        1.21        0.95        0.77        0.06        4.41
      # 11 KJAAAOFA 2851      EUR        0.91        1.21        4.88        1.02        1.14
      # 12 LJAABOFA 2587      YEN        0.37        0.53        0.97        4.71        3.01
